separating navigation item setters

This commit is contained in:
Pfeil, Scott Robert 2020-06-29 11:01:17 -04:00
parent a00a1fc3d1
commit e7c7351840
3 changed files with 56 additions and 32 deletions

View File

@ -94,9 +94,10 @@ import UIKit
try parsePageJSON() try parsePageJSON()
MVMCoreDispatchUtility.performBlock(onMainThread: { MVMCoreDispatchUtility.performBlock(onMainThread: {
self.handleNewDataAndUpdateUI() self.handleNewDataAndUpdateUI()
// If the screen is showing, can update the navigation controller.
if MVMCoreUIUtility.getCurrentVisibleController() == self.manager ?? self { // Update navigation bar if showing.
self.setNavigationController() if MVMCoreUIUtility.getCurrentVisibleController() == self {
self.setNavigationBar()
} }
}) })
} catch { } catch {
@ -168,12 +169,6 @@ import UIKit
/// Processes any new data. Called after the page is loaded the first time and on response updates for this page, /// Processes any new data. Called after the page is loaded the first time and on response updates for this page,
open func handleNewData() { open func handleNewData() {
// TODO: remove legacy. Temporary, convert legacy to navigation model.
if pageModel?.navigationBar == nil {
let navigationItem = createDefaultLegacyNavigationModel()
pageModel?.navigationBar = navigationItem
}
if formValidator == nil { if formValidator == nil {
let rules = pageModel?.formRules let rules = pageModel?.formRules
formValidator = FormValidator(rules) formValidator = FormValidator(rules)
@ -182,20 +177,43 @@ import UIKit
if let backgroundColor = pageModel?.backgroundColor { if let backgroundColor = pageModel?.backgroundColor {
view.backgroundColor = backgroundColor.uiColor view.backgroundColor = backgroundColor.uiColor
} }
// Sets up the navigation item based on the data.
setNavigationItem()
} }
// MARK: - Navigation Item (Move to model base) // MARK: - Navigation Item (Move to model base)
open func setNavigationController() {
open func getNavigationModel() -> NavigationItemModelProtocol? {
// TODO: remove legacy. Temporary, convert legacy to navigation model.
if pageModel?.navigationBar == nil {
let navigationItem = createDefaultLegacyNavigationModel()
pageModel?.navigationBar = navigationItem
}
return pageModel?.navigationBar
}
/// Sets the navigation item for this view controller.
open func setNavigationItem() {
guard let navigationItemModel = getNavigationModel(),
let navigationController = navigationController else { return }
// We additionally want our left items
navigationItem.leftItemsSupplementBackButton = true
// Utilize helper function to set the navigation item state.
NavigationController.setNavigationItem(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: self)
}
/// Sets the appearance of the navigation bar based on the model.
open func setNavigationBar() {
let viewController = manager ?? self let viewController = manager ?? self
guard let navigationItemModel = pageModel?.navigationBar, guard let navigationItemModel = getNavigationModel(),
let navigationController = viewController.navigationController else { let navigationController = viewController.navigationController else {
MVMCoreUISession.sharedGlobal()?.splitViewController?.parent?.setNeedsStatusBarAppearanceUpdate() MVMCoreUISession.sharedGlobal()?.splitViewController?.parent?.setNeedsStatusBarAppearanceUpdate()
return return
} }
// We additionally want our left items
navigationItem.leftItemsSupplementBackButton = true
// Utilize helper function to set the split view and navigation item state. // Utilize helper function to set the split view and navigation item state.
MVMCoreUISplitViewController.setSplitViewController(for: viewController, navigationController: navigationController, navigationItemModel: navigationItemModel, leftPanelAccessible: isMasterInitiallyAccessible(), rightPanelAccessible: isSupportInitiallyAccessible(), progress: bottomProgress() ?? 0) MVMCoreUISplitViewController.setSplitViewController(for: viewController, navigationController: navigationController, navigationItemModel: navigationItemModel, leftPanelAccessible: isMasterInitiallyAccessible(), rightPanelAccessible: isSupportInitiallyAccessible(), progress: bottomProgress() ?? 0)
} }
@ -308,7 +326,7 @@ import UIKit
open func pageShown() { open func pageShown() {
// Update the navigation bar ui when view is appearing. // Update the navigation bar ui when view is appearing.
setNavigationController() setNavigationBar()
// Update tab if needed. // Update tab if needed.
updateTabBar() updateTabBar()
@ -425,7 +443,7 @@ import UIKit
// Reset the navigation state. // Reset the navigation state.
public func splitViewDidReset() { public func splitViewDidReset() {
setNavigationController() setNavigationBar()
} }
// MARK: - UITextFieldDelegate (Check if this is still needed) // MARK: - UITextFieldDelegate (Check if this is still needed)

View File

@ -43,6 +43,14 @@ import UIKit
return navigationController return navigationController
} }
/// Convenience function for setting the navigation item.
public static func setNavigationItem(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, viewController: UIViewController) {
viewController.navigationItem.title = navigationItemModel.title
viewController.navigationItem.accessibilityLabel = navigationItemModel.title
viewController.navigationItem.hidesBackButton = (navigationItemModel.backButton != nil)
setNavigationButtons(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
}
/// Convenience function for setting the navigation buttons. /// Convenience function for setting the navigation buttons.
public static func setNavigationButtons(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, viewController: UIViewController) { public static func setNavigationButtons(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, viewController: UIViewController) {
let delegate = (viewController as? MVMCoreViewControllerProtocol)?.delegateObject?() as? MVMCoreUIDelegateObject let delegate = (viewController as? MVMCoreViewControllerProtocol)?.delegateObject?() as? MVMCoreUIDelegateObject
@ -68,11 +76,7 @@ import UIKit
} }
/// Convenience function for setting the navigation bar ui, except for the buttons. /// Convenience function for setting the navigation bar ui, except for the buttons.
public static func setNavigationUI(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, viewController: UIViewController) { public static func setNavigationBarUI(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, viewController: UIViewController) {
viewController.navigationItem.title = navigationItemModel.title
viewController.navigationItem.accessibilityLabel = navigationItemModel.title
viewController.navigationItem.hidesBackButton = (navigationItemModel.backButton != nil)
navigationController.setNavigationBarHidden(navigationItemModel.hidden, animated: true) navigationController.setNavigationBarHidden(navigationItemModel.hidden, animated: true)
navigationController.navigationBar.barTintColor = navigationItemModel.backgroundColor?.uiColor ?? .white navigationController.navigationBar.barTintColor = navigationItemModel.backgroundColor?.uiColor ?? .white
@ -88,17 +92,19 @@ import UIKit
} }
} }
/// Convenience function for setting navigation bar with model.
public static func set(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, viewController: UIViewController) {
setNavigationUI(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
setNavigationButtons(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
}
/// Convenience setter for legacy files /// Convenience setter for legacy files
public static func set(navigationController: UINavigationController, navigationJSON: [String: Any], viewController: UIViewController) throws { public static func setNavigationItem(navigationController: UINavigationController, navigationJSON: [String: Any], viewController: UIViewController) throws {
guard let barModel = try MoleculeObjectMapping.shared()?.getMoleculeModelForJSON(navigationJSON) as? (MoleculeModelProtocol & NavigationItemModelProtocol) else { guard let barModel = try MoleculeObjectMapping.shared()?.getMoleculeModelForJSON(navigationJSON) as? (MoleculeModelProtocol & NavigationItemModelProtocol) else {
throw ModelRegistry.Error.decoderOther(message: "Model not a bar model") throw ModelRegistry.Error.decoderOther(message: "Model not a bar model")
} }
set(navigationController: navigationController, navigationItemModel: barModel, viewController: viewController) setNavigationItem(navigationController: navigationController, navigationItemModel: barModel, viewController: viewController)
}
/// Convenience setter for legacy files
public static func setNavigationBarUI(navigationController: UINavigationController, navigationJSON: [String: Any], viewController: UIViewController) throws {
guard let barModel = try MoleculeObjectMapping.shared()?.getMoleculeModelForJSON(navigationJSON) as? (MoleculeModelProtocol & NavigationItemModelProtocol) else {
throw ModelRegistry.Error.decoderOther(message: "Model not a bar model")
}
setNavigationBarUI(navigationController: navigationController, navigationItemModel: barModel, viewController: viewController)
} }
} }

View File

@ -15,7 +15,7 @@ public extension MVMCoreUISplitViewController {
guard let splitView = MVMCoreUISplitViewController.main(), guard let splitView = MVMCoreUISplitViewController.main(),
navigationController == splitView.navigationController, navigationController == splitView.navigationController,
navigationController.topViewController == viewController else { navigationController.topViewController == viewController else {
NavigationController.set(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController) NavigationController.setNavigationBarUI(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
return return
} }
splitView.set(for: viewController, navigationController: navigationController, navigationItemModel: navigationItemModel, leftPanelAccessible: leftPanelAccessible, rightPanelAccessible: rightPanelAccessible, progress: progress) splitView.set(for: viewController, navigationController: navigationController, navigationItemModel: navigationItemModel, leftPanelAccessible: leftPanelAccessible, rightPanelAccessible: rightPanelAccessible, progress: progress)
@ -27,7 +27,7 @@ public extension MVMCoreUISplitViewController {
// Setup the panels. // Setup the panels.
setupPanels() setupPanels()
NavigationController.setNavigationUI(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController) NavigationController.setNavigationBarUI(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
setLeftPanelIsAccessible(leftPanelAccessible ?? leftPanelIsAccessible, for: viewController, updateNavigationButtons: false) setLeftPanelIsAccessible(leftPanelAccessible ?? leftPanelIsAccessible, for: viewController, updateNavigationButtons: false)
setRightPanelIsAccessible(rightPanelAccessible ?? rightPanelIsAccessible, for: viewController, updateNavigationButtons: false) setRightPanelIsAccessible(rightPanelAccessible ?? rightPanelIsAccessible, for: viewController, updateNavigationButtons: false)
@ -115,7 +115,7 @@ public extension MVMCoreUISplitViewController {
guard let splitView = MVMCoreUISplitViewController.main(), guard let splitView = MVMCoreUISplitViewController.main(),
navigationController == splitView.navigationController, navigationController == splitView.navigationController,
navigationController.topViewController == viewController else { navigationController.topViewController == viewController else {
NavigationController.set(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController) NavigationController.setNavigationBarUI(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
return return
} }
let progress = progress?.floatValue let progress = progress?.floatValue