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
|
/// 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)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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];
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user