flow fixes for manager propagation. Navigation fixes.
This commit is contained in:
parent
5af484daad
commit
4bdd6fa775
@ -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)
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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];
|
||||
|
||||
Loading…
Reference in New Issue
Block a user