diff --git a/MVMCoreUI/Atomic/Protocols/PageProtocol.swift b/MVMCoreUI/Atomic/Protocols/PageProtocol.swift index 3c2a338b..c96742a4 100644 --- a/MVMCoreUI/Atomic/Protocols/PageProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/PageProtocol.swift @@ -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) + } +} diff --git a/MVMCoreUI/BaseControllers/ViewController.swift b/MVMCoreUI/BaseControllers/ViewController.swift index dcd02c40..a751f2b1 100644 --- a/MVMCoreUI/BaseControllers/ViewController.swift +++ b/MVMCoreUI/BaseControllers/ViewController.swift @@ -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 {