flow fixes for manager propagation. Navigation fixes.

This commit is contained in:
Pfeil, Scott Robert 2021-06-22 17:00:52 -04:00
parent 5af484daad
commit 4bdd6fa775
3 changed files with 46 additions and 36 deletions

View File

@ -106,23 +106,28 @@ import UIKit
} }
} }
/// Convenience function to return the navigation model of the lowest controller traversing managers /// Convenience function to return the navigation model of the lowest controller traversing managers if applicable.
public static func getNavigationModel(from viewController: UIViewController) -> NavigationItemModelProtocol? { public func getNavigationModel(from viewController: UIViewController) -> NavigationItemModelProtocol? {
guard let controller = MVMCoreUIUtility.getViewControllerTraversingManagers(viewController), guard let topViewController = topViewController,
let model = (controller as? PageProtocol)?.pageModel?.navigationBar else { return nil } viewController == MVMCoreUIUtility.getViewControllerTraversingManagers(topViewController),
let model = (viewController as? PageProtocol)?.pageModel?.navigationBar else { return nil }
return model return model
} }
} }
extension NavigationController: MVMCoreViewManagerProtocol { extension NavigationController: MVMCoreViewManagerProtocol {
// TODO: change this to optional
public func getCurrentViewController() -> UIViewController? { public func getCurrentViewController() -> UIViewController? {
return topViewController guard let topViewController = topViewController else { return nil }
return MVMCoreUIUtility.getViewControllerTraversingManagers(topViewController)
} }
public func containsPage(withPageType pageType: String?) -> Bool { public func containsPage(withPageType pageType: String?) -> Bool {
for case let controller as MVMCoreViewControllerProtocol in viewControllers { for controller in viewControllers {
if controller.pageType == pageType { if let manager = controller as? MVMCoreViewManagerProtocol,
manager.containsPage(withPageType: pageType) {
return true
} else if let controller = controller as? MVMCoreViewControllerProtocol,
controller.pageType == pageType {
return true return true
} }
} }
@ -130,25 +135,25 @@ extension NavigationController: MVMCoreViewManagerProtocol {
} }
public func newDataReceived(in viewController: UIViewController) { public func newDataReceived(in viewController: UIViewController) {
guard let topViewController = topViewController, if let topViewController = topViewController,
viewController == MVMCoreUIUtility.getViewControllerTraversingManagers(topViewController), let model = getNavigationModel(from: viewController) {
let model = Self.getNavigationModel(from: viewController) else { return } Self.setNavigationItem(navigationController: self, navigationItemModel: model, viewController: topViewController)
Self.setNavigationItem(navigationController: self, navigationItemModel: model, viewController: viewController) Self.setNavigationBarUI(navigationController: self, navigationItemModel: model, viewController: topViewController)
Self.setNavigationBarUI(navigationController: self, navigationItemModel: model, viewController: viewController) }
manager?.newDataReceived?(in: viewController) manager?.newDataReceived?(in: viewController)
} }
public func willDisplay(_ viewController: UIViewController) { public func willDisplay(_ viewController: UIViewController) {
guard let topViewController = topViewController else { return } if let topViewController = topViewController,
if let model = Self.getNavigationModel(from: viewController) { let model = getNavigationModel(from: viewController) {
Self.setNavigationItem(navigationController: self, navigationItemModel: model, viewController: topViewController) Self.setNavigationItem(navigationController: self, navigationItemModel: model, viewController: topViewController)
} }
manager?.willDisplay?(viewController) manager?.willDisplay?(viewController)
} }
public func displayedViewController(_ viewController: UIViewController) { public func displayedViewController(_ viewController: UIViewController) {
guard let topViewController = topViewController else { return } if let topViewController = topViewController,
if let model = Self.getNavigationModel(from: viewController) { let model = getNavigationModel(from: viewController) {
Self.setNavigationBarUI(navigationController: self, navigationItemModel: model, viewController: topViewController) Self.setNavigationBarUI(navigationController: self, navigationItemModel: model, viewController: topViewController)
} }
manager?.displayedViewController?(viewController) manager?.displayedViewController?(viewController)
@ -161,18 +166,20 @@ extension NavigationController: MVMCorePresentationDelegateProtocol {
if let controller = viewController as? (UIViewController & MVMCoreViewManagerViewControllerProtocol) { if let controller = viewController as? (UIViewController & MVMCoreViewManagerViewControllerProtocol) {
MVMCoreViewManagerViewControllerProtocolHelper.helpSetManager(self, viewController: controller) MVMCoreViewManagerViewControllerProtocolHelper.helpSetManager(self, viewController: controller)
} }
if let model = Self.getNavigationModel(from: viewController) { guard let newViewController = MVMCoreUIUtility.getViewControllerTraversingManagers(viewController) else { return }
if let model = getNavigationModel(from: newViewController) {
Self.setNavigationItem(navigationController: self, navigationItemModel: model, viewController: viewController) Self.setNavigationItem(navigationController: self, navigationItemModel: model, viewController: viewController)
} }
manager?.willDisplay?(viewController) manager?.willDisplay?(newViewController)
} }
public func navigationController(_ navigationController: UINavigationController, displayedViewController viewController: UIViewController) { public func navigationController(_ navigationController: UINavigationController, displayedViewController viewController: UIViewController) {
guard self == navigationController else { return } guard self == navigationController,
if let model = Self.getNavigationModel(from: viewController) { let newViewController = MVMCoreUIUtility.getViewControllerTraversingManagers(viewController) else { return }
if let model = getNavigationModel(from: newViewController) {
Self.setNavigationBarUI(navigationController: self, navigationItemModel: model, viewController: viewController) Self.setNavigationBarUI(navigationController: self, navigationItemModel: model, viewController: viewController)
} }
manager?.displayedViewController?(viewController) manager?.displayedViewController?(newViewController)
if let controller = viewController as? (UIViewController & MVMCoreViewManagerViewControllerProtocol) { if let controller = viewController as? (UIViewController & MVMCoreViewManagerViewControllerProtocol) {
controller.viewControllerReady?(inManager: self) controller.viewControllerReady?(inManager: self)
} }

View File

@ -15,9 +15,8 @@ public extension MVMCoreUISplitViewController {
static func setNavigationBarUI(for viewController: UIViewController, navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol) { static func setNavigationBarUI(for viewController: UIViewController, navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol) {
guard let splitView = MVMCoreUISplitViewController.main(), guard let splitView = MVMCoreUISplitViewController.main(),
navigationController == splitView.navigationController, navigationController == splitView.navigationController,
navigationController.topViewController == viewController else { viewController == MVMCoreUISplitViewController.main()?.getCurrentDetailViewController() else {
/// Not the split view navigation controller, skip split functions. /// Not the split view navigation controller, skip split functions.
NavigationController.setNavigationBarUI(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
return return
} }
splitView.set(for: viewController, navigationController: navigationController, navigationItemModel: navigationItemModel) splitView.set(for: viewController, navigationController: navigationController, navigationItemModel: navigationItemModel)
@ -25,7 +24,6 @@ public extension MVMCoreUISplitViewController {
/// Sets the navigation item for the view controller based on the model and splitview controller /// Sets the navigation item for the view controller based on the model and splitview controller
private func set(for viewController: UIViewController, navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol) { private func set(for viewController: UIViewController, navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol) {
setLeftPanelIsAccessible((viewController as? MVMCoreUIDetailViewProtocol)?.isLeftPanelAccessible?() ?? false, for: viewController, updateNavigationButtons: false) setLeftPanelIsAccessible((viewController as? MVMCoreUIDetailViewProtocol)?.isLeftPanelAccessible?() ?? false, for: viewController, updateNavigationButtons: false)
setRightPanelIsAccessible((viewController as? MVMCoreUIDetailViewProtocol)?.isRightPanelAccessible?() ?? false, for: viewController, updateNavigationButtons: false) setRightPanelIsAccessible((viewController as? MVMCoreUIDetailViewProtocol)?.isRightPanelAccessible?() ?? false, for: viewController, updateNavigationButtons: false)
@ -37,6 +35,8 @@ public extension MVMCoreUISplitViewController {
/// Sets the left navigation items for the view controller based on model and splitview. /// Sets the left navigation items for the view controller based on model and splitview.
func setLeftNavigationButtons(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol?, viewController: UIViewController) { func setLeftNavigationButtons(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol?, viewController: UIViewController) {
guard let topViewController = navigationController.topViewController else { return }
var leftItems: [UIBarButtonItem] = [] var leftItems: [UIBarButtonItem] = []
let delegate = (viewController as? MVMCoreViewControllerProtocol)?.delegateObject?() as? MVMCoreUIDelegateObject let delegate = (viewController as? MVMCoreViewControllerProtocol)?.delegateObject?() as? MVMCoreUIDelegateObject
@ -75,11 +75,13 @@ public extension MVMCoreUISplitViewController {
leftItems.append(contentsOf: additionalLeftButtons) leftItems.append(contentsOf: additionalLeftButtons)
} }
navigationController.topViewController?.navigationItem.setLeftBarButtonItems(leftItems.count > 0 ? leftItems : nil, animated: !DisableAnimations.boolValue) topViewController.navigationItem.setLeftBarButtonItems(leftItems.count > 0 ? leftItems : nil, animated: !DisableAnimations.boolValue)
} }
/// Sets the right navigation items for the view controller based on model and splitview. /// Sets the right navigation items for the view controller based on model and splitview.
func setRightNavigationButtons(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol?, viewController: UIViewController) { func setRightNavigationButtons(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol?, viewController: UIViewController) {
guard let topViewController = navigationController.topViewController else { return }
let delegate = (viewController as? MVMCoreViewControllerProtocol)?.delegateObject?() as? MVMCoreUIDelegateObject let delegate = (viewController as? MVMCoreViewControllerProtocol)?.delegateObject?() as? MVMCoreUIDelegateObject
var rightItems: [UIBarButtonItem] = [] var rightItems: [UIBarButtonItem] = []
@ -102,19 +104,20 @@ public extension MVMCoreUISplitViewController {
rightItems.append(contentsOf: additionalRightButtons) rightItems.append(contentsOf: additionalRightButtons)
} }
navigationController.topViewController?.navigationItem.setRightBarButtonItems(rightItems.count > 0 ? rightItems : nil, animated: !DisableAnimations.boolValue) topViewController.navigationItem.setRightBarButtonItems(rightItems.count > 0 ? rightItems : nil, animated: !DisableAnimations.boolValue)
} }
@objc func navigationBarModelExists() -> Bool { @objc func navigationBarModelExists() -> Bool {
// Legacy Navigation // Legacy Navigation
(navigationController?.topViewController as? PageProtocol)?.pageModel?.navigationBar != nil guard let currentViewController = getCurrentDetailViewController(),
let _ = navigationController?.getNavigationModel(from: currentViewController) else { return false }
return true
} }
/// Convenience function to update the navigation /// Convenience function to update the navigation bar for the
@objc func updateNavigationBarFor(viewController: UIViewController) { @objc func updateNavigationBarFor(viewController: UIViewController) {
guard viewController == getCurrentDetailViewController(), guard let navigationController = navigationController,
let navigationController = navigationController, let model = navigationController.getNavigationModel(from: viewController) else { return }
let model = NavigationController.getNavigationModel(from: viewController) else { return }
set(for: viewController, navigationController: navigationController, navigationItemModel: model) set(for: viewController, navigationController: navigationController, navigationItemModel: model)
} }
} }

View File

@ -240,7 +240,7 @@ CGFloat const PanelAnimationDuration = 0.2;
- (void)setLeftNavigationItemForViewController:(UIViewController * _Nonnull)viewController accessible:(BOOL)accessible extended:(BOOL)extended { - (void)setLeftNavigationItemForViewController:(UIViewController * _Nonnull)viewController accessible:(BOOL)accessible extended:(BOOL)extended {
NSMutableArray *leftBarButtonItems = [NSMutableArray array]; NSMutableArray *leftBarButtonItems = [NSMutableArray array];
if (viewController.navigationController && [MVMCoreNavigationHandler.sharedNavigationHandler getViewControllersForNavigationController:viewController.navigationController].count > 1) { if (self.navigationController && [MVMCoreNavigationHandler.sharedNavigationHandler getViewControllersForNavigationController:self.navigationController].count > 1) {
[leftBarButtonItems addObject:self.backButton]; [leftBarButtonItems addObject:self.backButton];
} }
if ((accessible && !extended) && self.leftPanelButton) { if ((accessible && !extended) && self.leftPanelButton) {
@ -250,7 +250,7 @@ CGFloat const PanelAnimationDuration = 0.2;
if (extraButtons) { if (extraButtons) {
[leftBarButtonItems addObjectsFromArray:extraButtons]; [leftBarButtonItems addObjectsFromArray:extraButtons];
} }
[viewController.navigationItem setLeftBarButtonItems:(leftBarButtonItems.count > 0 ? leftBarButtonItems : nil) animated:!DisableAnimations]; [self.navigationController.topViewController.navigationItem setLeftBarButtonItems:(leftBarButtonItems.count > 0 ? leftBarButtonItems : nil) animated:!DisableAnimations];
} }
- (void)setLeftPanelIsAccessible:(BOOL)leftPanelIsAccessible forViewController:(UIViewController *)viewController updateNavigationButtons:(BOOL)updateNavigationButtons { - (void)setLeftPanelIsAccessible:(BOOL)leftPanelIsAccessible forViewController:(UIViewController *)viewController updateNavigationButtons:(BOOL)updateNavigationButtons {
@ -422,7 +422,7 @@ CGFloat const PanelAnimationDuration = 0.2;
if (extraButtons) { if (extraButtons) {
[navigationItems addObjectsFromArray:extraButtons]; [navigationItems addObjectsFromArray:extraButtons];
} }
[viewController.navigationItem setRightBarButtonItems:(navigationItems.count > 0 ? navigationItems : nil) animated:!DisableAnimations]; [self.navigationController.topViewController.navigationItem setRightBarButtonItems:(navigationItems.count > 0 ? navigationItems : nil) animated:!DisableAnimations];
} }
- (BOOL)shouldExtendRightPanel { - (BOOL)shouldExtendRightPanel {
@ -991,7 +991,7 @@ CGFloat const PanelAnimationDuration = 0.2;
- (void)resetDrawers { - (void)resetDrawers {
if (!self.navigationItemViewController) { return; } if (!self.navigationItemViewController) { return; }
if ([self navigationBarModelExists]) { if ([self navigationBarModelExists]) {
[self updateNavigationBarForViewController:self.navigationItemViewController]; [self updateNavigationBarForViewController:[MVMCoreUIUtility getViewControllerTraversingManagers:self.navigationItemViewController]];
} else { } else {
// Legacy // Legacy
[self setLeftPanelIsAccessible:self.leftPanelIsAccessible forViewController:self.navigationItemViewController updateNavigationButtons:YES]; [self setLeftPanelIsAccessible:self.leftPanelIsAccessible forViewController:self.navigationItemViewController updateNavigationButtons:YES];