Navigation Refresh protocol

This commit is contained in:
Pfeil, Scott Robert 2020-10-07 18:15:52 -04:00
parent fc9272d0b7
commit e60824ee1b
2 changed files with 35 additions and 9 deletions

View File

@ -11,18 +11,39 @@ import Foundation
public protocol PageProtocol {
var pageModel: PageModelProtocol? { get set }
mutating func updateNavigation(with model: NavigationItemModelProtocol & MoleculeModelProtocol)
/// Sets the navigationBar property of the pageModel and attempts to refresh the ui.
mutating func updateNavigationBar(with model: NavigationItemModelProtocol & MoleculeModelProtocol)
}
public extension PageProtocol where Self: UIViewController {
mutating func updateNavigation(with model: NavigationItemModelProtocol & MoleculeModelProtocol) {
extension PageProtocol {
mutating public func updateNavigationBar(with model: NavigationItemModelProtocol & MoleculeModelProtocol) {
pageModel?.navigationBar = model
if var manager = ((self as? MVMCoreViewManagerViewControllerProtocol)?.manager as? PageProtocol) {
(self as? NavigationBarRefreshProtocol)?.refreshNavigationUI()
}
}
/// A protocol to inform that we should refresh the navigation bar ui.
@objc public protocol NavigationBarRefreshProtocol {
@objc func refreshNavigationUI()
}
public extension UINavigationBar {
/// Convenience function to refresh the navigation bar ui.
@objc static func refreshNavigationUI(for viewController: UIViewController) {
guard let model = (viewController as? PageProtocol)?.pageModel?.navigationBar else { return }
if let manager = ((viewController as? MVMCoreViewManagerViewControllerProtocol)?.manager as? NavigationBarRefreshProtocol) {
// Go through the manager if possible.
manager.updateNavigation(with: model)
} else if let navigationController = navigationController {
NavigationController.setNavigationItem(navigationController: navigationController, navigationItemModel: model, viewController: self)
MVMCoreUISplitViewController.setNavigationBarUI(for: self, navigationController: navigationController, navigationItemModel: model, leftPanelAccessible: (self as? MVMCoreUIDetailViewProtocol)?.isLeftPanelAccessible?(), rightPanelAccessible: (self as? MVMCoreUIDetailViewProtocol)?.isRightPanelAccessible?())
manager.refreshNavigationUI()
} else if let navigationController = viewController.navigationController {
NavigationController.setNavigationItem(navigationController: navigationController, navigationItemModel: model, viewController: viewController)
MVMCoreUISplitViewController.setNavigationBarUI(for: viewController, navigationController: navigationController, navigationItemModel: model, leftPanelAccessible: (viewController as? MVMCoreUIDetailViewProtocol)?.isLeftPanelAccessible?(), rightPanelAccessible: (viewController as? MVMCoreUIDetailViewProtocol)?.isRightPanelAccessible?())
}
}
}
extension UIViewController: NavigationBarRefreshProtocol {
public func refreshNavigationUI() {
UINavigationBar.refreshNavigationUI(for: self)
}
}

View File

@ -121,7 +121,12 @@ import UIKit
// Update navigation bar if showing.
if MVMCoreUIUtility.getCurrentVisibleController() == self {
self.setNavigationBar()
if let manager = self.manager {
// Let manager handle
manager.refreshNavigationUI()
} else {
self.setNavigationBar()
}
}
})
} catch {