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

View File

@ -15,9 +15,8 @@ public extension MVMCoreUISplitViewController {
static func setNavigationBarUI(for viewController: UIViewController, navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol) {
guard let splitView = MVMCoreUISplitViewController.main(),
navigationController == splitView.navigationController,
navigationController.topViewController == viewController else {
viewController == MVMCoreUISplitViewController.main()?.getCurrentDetailViewController() else {
/// Not the split view navigation controller, skip split functions.
NavigationController.setNavigationBarUI(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
return
}
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
private func set(for viewController: UIViewController, navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol) {
setLeftPanelIsAccessible((viewController as? MVMCoreUIDetailViewProtocol)?.isLeftPanelAccessible?() ?? 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.
func setLeftNavigationButtons(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol?, viewController: UIViewController) {
guard let topViewController = navigationController.topViewController else { return }
var leftItems: [UIBarButtonItem] = []
let delegate = (viewController as? MVMCoreViewControllerProtocol)?.delegateObject?() as? MVMCoreUIDelegateObject
@ -75,11 +75,13 @@ public extension MVMCoreUISplitViewController {
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.
func setRightNavigationButtons(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol?, viewController: UIViewController) {
guard let topViewController = navigationController.topViewController else { return }
let delegate = (viewController as? MVMCoreViewControllerProtocol)?.delegateObject?() as? MVMCoreUIDelegateObject
var rightItems: [UIBarButtonItem] = []
@ -102,19 +104,20 @@ public extension MVMCoreUISplitViewController {
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 {
// 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) {
guard viewController == getCurrentDetailViewController(),
let navigationController = navigationController,
let model = NavigationController.getNavigationModel(from: viewController) else { return }
guard let navigationController = navigationController,
let model = navigationController.getNavigationModel(from: viewController) else { return }
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 {
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];
}
if ((accessible && !extended) && self.leftPanelButton) {
@ -250,7 +250,7 @@ CGFloat const PanelAnimationDuration = 0.2;
if (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 {
@ -422,7 +422,7 @@ CGFloat const PanelAnimationDuration = 0.2;
if (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 {
@ -991,7 +991,7 @@ CGFloat const PanelAnimationDuration = 0.2;
- (void)resetDrawers {
if (!self.navigationItemViewController) { return; }
if ([self navigationBarModelExists]) {
[self updateNavigationBarForViewController:self.navigationItemViewController];
[self updateNavigationBarForViewController:[MVMCoreUIUtility getViewControllerTraversingManagers:self.navigationItemViewController]];
} else {
// Legacy
[self setLeftPanelIsAccessible:self.leftPanelIsAccessible forViewController:self.navigationItemViewController updateNavigationButtons:YES];