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 { public protocol PageProtocol {
var pageModel: PageModelProtocol? { get set } 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 { extension PageProtocol {
mutating func updateNavigation(with model: NavigationItemModelProtocol & MoleculeModelProtocol) { mutating public func updateNavigationBar(with model: NavigationItemModelProtocol & MoleculeModelProtocol) {
pageModel?.navigationBar = model 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. // Go through the manager if possible.
manager.updateNavigation(with: model) manager.refreshNavigationUI()
} else if let navigationController = navigationController { } else if let navigationController = viewController.navigationController {
NavigationController.setNavigationItem(navigationController: navigationController, navigationItemModel: model, viewController: self) NavigationController.setNavigationItem(navigationController: navigationController, navigationItemModel: model, viewController: viewController)
MVMCoreUISplitViewController.setNavigationBarUI(for: self, navigationController: navigationController, navigationItemModel: model, leftPanelAccessible: (self as? MVMCoreUIDetailViewProtocol)?.isLeftPanelAccessible?(), rightPanelAccessible: (self as? MVMCoreUIDetailViewProtocol)?.isRightPanelAccessible?()) 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. // Update navigation bar if showing.
if MVMCoreUIUtility.getCurrentVisibleController() == self { if MVMCoreUIUtility.getCurrentVisibleController() == self {
self.setNavigationBar() if let manager = self.manager {
// Let manager handle
manager.refreshNavigationUI()
} else {
self.setNavigationBar()
}
} }
}) })
} catch { } catch {