From 1d556b65630b543148a4f6ab69dc212931e6721d Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Fri, 11 Jun 2021 10:31:03 -0400 Subject: [PATCH 01/10] manager changes to allow manager to handle navigation bar logic --- MVMCoreUI.xcodeproj/project.pbxproj | 4 - .../NavigationBarRefreshProtocol.swift | 34 --------- .../BaseControllers/ViewController.swift | 56 ++++---------- MVMCoreUI/Behaviors/GetContactBehavior.swift | 12 --- .../Containers/NavigationController.swift | 74 ++++++++++++++++++- .../MVMCoreUIDetailViewProtocol.h | 3 - ...MCoreUISplitViewController+Extension.swift | 32 +++++++- .../MVMCoreUISplitViewController.m | 17 ++--- MVMCoreUI/Utility/MVMCoreUIUtility.h | 3 + MVMCoreUI/Utility/MVMCoreUIUtility.m | 13 +++- 10 files changed, 136 insertions(+), 112 deletions(-) delete mode 100644 MVMCoreUI/Atomic/Protocols/NavigationBarRefreshProtocol.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index d48fa228..c9833c3f 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -323,7 +323,6 @@ D20C7009250BF99B0095B21C /* TopNotificationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20C7008250BF99B0095B21C /* TopNotificationModel.swift */; }; D20C700B250BFDE40095B21C /* MVMCoreUITopAlertView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20C700A250BFDE40095B21C /* MVMCoreUITopAlertView+Extension.swift */; }; D20F3B44252E00E4004B3F56 /* PageProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20F3B43252E00E4004B3F56 /* PageProtocol.swift */; }; - D20F3B5E252F9B5E004B3F56 /* NavigationBarRefreshProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20F3B5D252F9B5D004B3F56 /* NavigationBarRefreshProtocol.swift */; }; D20FB165241A5D75004AFC3A /* NavigationItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20FB164241A5D75004AFC3A /* NavigationItemModel.swift */; }; D213347723843825008E41B3 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = D213347623843825008E41B3 /* Line.swift */; }; D2169301251E51E7002A6324 /* SectionListTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2169300251E51E7002A6324 /* SectionListTemplate.swift */; }; @@ -887,7 +886,6 @@ D20C7008250BF99B0095B21C /* TopNotificationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopNotificationModel.swift; sourceTree = ""; }; D20C700A250BFDE40095B21C /* MVMCoreUITopAlertView+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MVMCoreUITopAlertView+Extension.swift"; sourceTree = ""; }; D20F3B43252E00E4004B3F56 /* PageProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageProtocol.swift; sourceTree = ""; }; - D20F3B5D252F9B5D004B3F56 /* NavigationBarRefreshProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarRefreshProtocol.swift; sourceTree = ""; }; D20FB164241A5D75004AFC3A /* NavigationItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationItemModel.swift; sourceTree = ""; }; D213347623843825008E41B3 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = ""; }; D2169300251E51E7002A6324 /* SectionListTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionListTemplate.swift; sourceTree = ""; }; @@ -2319,7 +2317,6 @@ D20F3B43252E00E4004B3F56 /* PageProtocol.swift */, 012A88AC238C418100FE3DA1 /* TemplateProtocol.swift */, D28BA7442481652D00B75CB8 /* TabBarProtocol.swift */, - D20F3B5D252F9B5D004B3F56 /* NavigationBarRefreshProtocol.swift */, 011B58EE23A2AA850085F53C /* ModelProtocols */, ); path = Protocols; @@ -2754,7 +2751,6 @@ D22479942316AE5E003FCCF9 /* NSLayoutConstraintExtension.swift in Sources */, D2B18B94236214AD00A9AEDC /* NavigationController.swift in Sources */, 0A9D09222433796500D2E6C0 /* CarouselIndicator.swift in Sources */, - D20F3B5E252F9B5E004B3F56 /* NavigationBarRefreshProtocol.swift in Sources */, D29E28DA23D21AFA00ACEA85 /* StringAndMoleculeModel.swift in Sources */, D260105D23D0BCD400764D80 /* Stack.swift in Sources */, 0A7EF85D23D8A95600B2AAD1 /* TextEntryFieldModel.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Protocols/NavigationBarRefreshProtocol.swift b/MVMCoreUI/Atomic/Protocols/NavigationBarRefreshProtocol.swift deleted file mode 100644 index 2d4002e3..00000000 --- a/MVMCoreUI/Atomic/Protocols/NavigationBarRefreshProtocol.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// NavigationBarRefreshProtocol.swift -// MVMCoreUI -// -// Created by Scott Pfeil on 10/8/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import Foundation - -/// A protocol to inform that we should refresh the navigation bar ui. -@objc public protocol NavigationBarRefreshProtocol { - @objc func refreshNavigationUI() -} - -extension UIViewController: NavigationBarRefreshProtocol { - - /// Convenience function to refresh the navigation bar ui. A separate function for others to use. - @objc public static func refreshNavigationUI(for viewController: UIViewController) { - guard let model = (viewController as? PageProtocol)?.pageModel?.navigationBar else { return } - if let navigationController = viewController.navigationController { - NavigationController.setNavigationItem(navigationController: navigationController, navigationItemModel: model, viewController: viewController) - MVMCoreUISplitViewController.setNavigationBarUI(for: viewController, navigationController: navigationController, navigationItemModel: model) - } - if let manager = ((viewController as? MVMCoreViewManagerViewControllerProtocol)?.manager as? NavigationBarRefreshProtocol) { - // Refresh the manager if possible. - manager.refreshNavigationUI() - } - } - - public func refreshNavigationUI() { - UIViewController.refreshNavigationUI(for: self) - } -} diff --git a/MVMCoreUI/BaseControllers/ViewController.swift b/MVMCoreUI/BaseControllers/ViewController.swift index cd67632f..f86061e5 100644 --- a/MVMCoreUI/BaseControllers/ViewController.swift +++ b/MVMCoreUI/BaseControllers/ViewController.swift @@ -114,17 +114,6 @@ import UIKit try parsePageJSON() MVMCoreDispatchUtility.performBlock(onMainThread: { self.handleNewDataAndUpdateUI() - - if MVMCoreUIUtility.getCurrentVisibleController() == self { - // Update navigation bar if showing. - self.setNavigationBar() - self.manager?.refreshNavigationUI() - } - // Update splitview properties - if self == MVMCoreUISplitViewController.main()?.getCurrentDetailViewController() { - MVMCoreUISplitViewController.main()?.setBottomProgressBarProgress(self.bottomProgress() ?? 0) - self.updateTabBar() - } }) } catch { if let coreError = MVMCoreErrorObject.createErrorObject(for: error, location: "updateJSON for pageType: \(String(describing: pageType))") { @@ -237,6 +226,11 @@ import UIKit /// Processes any new data. Called after the page is loaded the first time and on response updates for this page, open func handleNewData() { + if model?.navigationBar == nil { + let navigationItem = createDefaultLegacyNavigationModel() + model?.navigationBar = navigationItem + } + executeBehaviors { (behavior: PageMoleculeTransformationBehavior) in behavior.onPageNew(rootMolecules: getRootMolecules(), delegateObjectIVar) } @@ -250,8 +244,14 @@ import UIKit view.backgroundColor = backgroundColor.uiColor } - // Sets up the navigation item based on the data. - setNavigationItem() + // Update splitview properties + if self == MVMCoreUISplitViewController.main()?.getCurrentDetailViewController() { + MVMCoreUISplitViewController.main()?.setBottomProgressBarProgress(bottomProgress() ?? 0) + updateTabBar() + } + + // Notify the manager of new data + manager?.newDataReceived?(in: self) } //-------------------------------------------------- @@ -267,28 +267,6 @@ import UIKit return model?.navigationBar } - /// Sets the navigation item for this view controller. - open func setNavigationItem() { - guard let navigationItemModel = getNavigationModel(), - let navigationController = navigationController - else { return } - - // Utilize helper function to set the navigation item state. - NavigationController.setNavigationItem(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: self) - } - - /// Sets the appearance of the navigation bar based on the model. - open func setNavigationBar() { - guard let navigationItemModel = getNavigationModel(), - let navigationController = navigationController else { - MVMCoreUISession.sharedGlobal()?.splitViewController?.parent?.setNeedsStatusBarAppearanceUpdate() - return - } - - // Utilize helper function to set the split view and navigation item state. - MVMCoreUISplitViewController.setNavigationBarUI(for: self, navigationController: navigationController, navigationItemModel: navigationItemModel) - } - //-------------------------------------------------- // MARK: - TabBar //-------------------------------------------------- @@ -378,9 +356,6 @@ import UIKit updateTabBar() } - // Update the navigation bar ui when view is appearing. - setNavigationBar() - // Track. MVMCoreUISession.sharedGlobal()?.currentPageType = pageType MVMCoreUILoggingHandler.shared()?.defaultLogPageState(forController: self) @@ -536,11 +511,6 @@ import UIKit // MARK: - MVMCoreUIDetailViewProtocol //-------------------------------------------------- - // Reset the navigation state. - public func splitViewDidReset() { - setNavigationBar() - } - public func isLeftPanelAccessible() -> Bool { // TODO: Remove when hamburger menu is fully phased out. if loadObject?.pageJSON?.boolForKey(KeyHideMainMenu) ?? false { diff --git a/MVMCoreUI/Behaviors/GetContactBehavior.swift b/MVMCoreUI/Behaviors/GetContactBehavior.swift index 9b488e68..c69bdbce 100644 --- a/MVMCoreUI/Behaviors/GetContactBehavior.swift +++ b/MVMCoreUI/Behaviors/GetContactBehavior.swift @@ -43,18 +43,6 @@ public class PageGetContactBehavior: PageVisibilityBehavior { // TODO: move to protocol function instead guard let controller = self?.delegate?.moleculeDelegate as? ViewController else { return } controller.handleNewDataAndUpdateUI() - - if MVMCoreUIUtility.getCurrentVisibleController() == controller { - // Update navigation bar if showing. - controller.setNavigationBar() - controller.manager?.refreshNavigationUI() - } - - // Update splitview properties - if controller == MVMCoreUISplitViewController.main()?.getCurrentDetailViewController() { - MVMCoreUISplitViewController.main()?.setBottomProgressBarProgress(controller.bottomProgress() ?? 0) - controller.updateTabBar() - } }) } } diff --git a/MVMCoreUI/Containers/NavigationController.swift b/MVMCoreUI/Containers/NavigationController.swift index 331656b7..bcbf927e 100644 --- a/MVMCoreUI/Containers/NavigationController.swift +++ b/MVMCoreUI/Containers/NavigationController.swift @@ -8,8 +8,9 @@ import UIKit -@objcMembers open class NavigationController: UINavigationController { +@objcMembers open class NavigationController: UINavigationController, MVMCoreViewManagerViewControllerProtocol { public var separatorView: Line? + public var manager: (UIViewController & MVMCoreViewManagerProtocol)? /// Getter for the main navigation controller public static func navigationController() -> Self? { @@ -33,6 +34,7 @@ import UIKit MVMCoreUISession.sharedGlobal()?.navigationController = navigationController MVMCoreNavigationHandler.shared()?.viewControllerToPresentOn = navigationController MVMCoreNavigationHandler.shared()?.navigationController = navigationController + MVMCoreNavigationHandler.shared()?.addDelegate(navigationController) return navigationController } @@ -103,4 +105,74 @@ import UIKit viewController.navigationItem.titleView = molecule } } + + /// Convenience function to return the navigation model of the lowest controller traversing managers + public static func getNavigationModel(from viewController: UIViewController) -> NavigationItemModelProtocol? { + let controller = MVMCoreUIUtility.getViewControllerTraversingManagers(viewController) + guard let model = (controller as? PageProtocol)?.pageModel?.navigationBar else { return nil } + return model + } +} + +extension NavigationController: MVMCoreViewManagerProtocol { + // TODO: change this to optional + public func getCurrentViewController() -> UIViewController { + return topViewController! + } + + public func containsPage(withPageType pageType: String?) -> Bool { + for case let controller as MVMCoreViewControllerProtocol in viewControllers { + if controller.pageType == pageType { + return true + } + } + return false + } + + public func newDataReceived(in viewController: UIViewController) { + if viewController == topViewController, + let model = Self.getNavigationModel(from: viewController) { + Self.setNavigationItem(navigationController: self, navigationItemModel: model, viewController: viewController) + Self.setNavigationBarUI(navigationController: self, navigationItemModel: model, viewController: viewController) + } + manager?.newDataReceived?(in: viewController) + } + + public func willDisplay(_ viewController: UIViewController) { + guard let topViewController = topViewController else { return } + if let model = Self.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) { + Self.setNavigationBarUI(navigationController: self, navigationItemModel: model, viewController: topViewController) + } + manager?.displayedViewController?(viewController) + } +} + +extension NavigationController: MVMCorePresentationDelegateProtocol { + public func navigationController(_ navigationController: UINavigationController, willDisplay viewController: UIViewController) { + guard self == navigationController else { return } + if let controller = viewController as? (UIViewController & MVMCoreViewManagerViewControllerProtocol) { + MVMCoreViewManagerViewControllerProtocolHelper.helpSetManager(self, viewController: controller) + controller.viewControllerReady?(inManager: self) + } + if let model = Self.getNavigationModel(from: viewController) { + Self.setNavigationItem(navigationController: self, navigationItemModel: model, viewController: viewController) + } + manager?.willDisplay?(viewController) + } + + public func navigationController(_ navigationController: UINavigationController, displayedViewController viewController: UIViewController) { + guard self == navigationController else { return } + if let model = Self.getNavigationModel(from: viewController) { + Self.setNavigationBarUI(navigationController: self, navigationItemModel: model, viewController: viewController) + } + manager?.displayedViewController?(viewController) + } } diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUIDetailViewProtocol.h b/MVMCoreUI/Containers/SplitViewController/MVMCoreUIDetailViewProtocol.h index 60ce0873..bd81fec5 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUIDetailViewProtocol.h +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUIDetailViewProtocol.h @@ -48,9 +48,6 @@ NS_ASSUME_NONNULL_BEGIN - (UIStatusBarStyle)defaultStatusBarStyle; - (nullable UIColor *)defaultStatusBarBackgroundColor; -/// Called when the split view did reset. If this function found, the splitview assumes it is handling the split view state and does not do anything. If you have navigation item buttons, override this function and handle the panels manually. -- (void)splitViewDidReset; - @end NS_ASSUME_NONNULL_END diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift index eb22eccb..835a2df9 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift @@ -24,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) { - NavigationController.setNavigationBarUI(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController) setLeftPanelIsAccessible((viewController as? MVMCoreUIDetailViewProtocol)?.isLeftPanelAccessible?() ?? false, for: viewController, updateNavigationButtons: false) setRightPanelIsAccessible((viewController as? MVMCoreUIDetailViewProtocol)?.isRightPanelAccessible?() ?? false, for: viewController, updateNavigationButtons: false) @@ -104,4 +103,35 @@ public extension MVMCoreUISplitViewController { viewController.navigationItem.setRightBarButtonItems(rightItems.count > 0 ? rightItems : nil, animated: !DisableAnimations.boolValue) } + + @objc func navigationBarModelExists() -> Bool { + // Legacy Navigation + (navigationController?.topViewController as? PageProtocol)?.pageModel?.navigationBar != nil + } + + /// Convenience function to update the navigation + @objc func updateNavigationBarFor(viewController: UIViewController) { + guard viewController == getCurrentDetailViewController(), + let navigationController = navigationController, + let model = NavigationController.getNavigationModel(from: viewController) else { return } + set(for: viewController, navigationController: navigationController, navigationItemModel: model) + } +} + +extension MVMCoreUISplitViewController: MVMCoreViewManagerProtocol { + public func getCurrentViewController() -> UIViewController { + navigationController!.getCurrentViewController() + } + + public func containsPage(withPageType pageType: String?) -> Bool { + navigationController!.containsPage(withPageType: pageType) + } + + public func displayedViewController(_ viewController: UIViewController) { + updateNavigationBarFor(viewController: viewController) + } + + public func newDataReceived(in viewController: UIViewController) { + updateNavigationBarFor(viewController: viewController) + } } diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m index 3b1de765..ab44e181 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m @@ -857,6 +857,7 @@ CGFloat const PanelAnimationDuration = 0.2; // The main view. NavigationController *navigationController = [NavigationController setupNavigationController]; + navigationController.manager = self; self.navigationController = navigationController; UIView *mainView = navigationController.view; @@ -988,9 +989,11 @@ CGFloat const PanelAnimationDuration = 0.2; } - (void)resetDrawers { - if ([self.navigationItemViewController respondsToSelector:@selector(splitViewDidReset)]) { - [((UIViewController *)self.navigationItemViewController) splitViewDidReset]; + if (!self.navigationItemViewController) { return; } + if ([self navigationBarModelExists]) { + [self updateNavigationBarForViewController:self.navigationItemViewController]; } else { + // Legacy [self setLeftPanelIsAccessible:self.leftPanelIsAccessible forViewController:self.navigationItemViewController updateNavigationButtons:YES]; [self setRightPanelIsAccessible:self.rightPanelIsAccessible forViewController:self.navigationItemViewController updateNavigationButtons:YES]; @@ -1066,10 +1069,7 @@ CGFloat const PanelAnimationDuration = 0.2; } // if it is not presented viewcontroller, existing BAU logic will be working if (!viewController) { - viewController = self.navigationController.topViewController; - if ([viewController conformsToProtocol:@protocol(MVMCoreViewManagerProtocol)]) { - viewController = [viewController performSelector:@selector(getCurrentViewController)]; - } + viewController = [MVMCoreUIUtility getViewControllerTraversingManagers:self.navigationController.topViewController]; } return viewController; } @@ -1077,10 +1077,7 @@ CGFloat const PanelAnimationDuration = 0.2; - (UIViewController *)getCurrentDetailViewController { __block UIViewController *viewController = nil; [MVMCoreDispatchUtility performSyncBlockOnMainThread:^{ - viewController = self.navigationController.topViewController; - if ([viewController conformsToProtocol:@protocol(MVMCoreViewManagerProtocol)]) { - viewController = [viewController performSelector:@selector(getCurrentViewController)]; - } + viewController = [MVMCoreUIUtility getViewControllerTraversingManagers:self.navigationController.topViewController]; }]; return viewController; } diff --git a/MVMCoreUI/Utility/MVMCoreUIUtility.h b/MVMCoreUI/Utility/MVMCoreUIUtility.h index 6852e936..171ebeea 100644 --- a/MVMCoreUI/Utility/MVMCoreUIUtility.h +++ b/MVMCoreUI/Utility/MVMCoreUIUtility.h @@ -34,6 +34,9 @@ NS_ASSUME_NONNULL_BEGIN /// Gets the current visible view controller. Checks presented view controllers first, and then it checks on the NavigationController in the session object. + (UIViewController *)getCurrentVisibleController; +/// Gets the first non manager controller. ++ (UIViewController *)getViewControllerTraversingManagers:(UIViewController *)viewController; + /// Checks if the view or any descendents of the view is currently focused for voice over. + (BOOL)viewContainsAccessiblityFocus:(nonnull UIView *)view; diff --git a/MVMCoreUI/Utility/MVMCoreUIUtility.m b/MVMCoreUI/Utility/MVMCoreUIUtility.m index dd059fed..01f576c5 100644 --- a/MVMCoreUI/Utility/MVMCoreUIUtility.m +++ b/MVMCoreUI/Utility/MVMCoreUIUtility.m @@ -63,14 +63,19 @@ } // if it is not presented viewcontroller, existing BAU logic will be working if (!viewController) { - viewController = [MVMCoreUISession sharedGlobal].navigationController.topViewController; - if ([viewController conformsToProtocol:@protocol(MVMCoreViewManagerProtocol)]) { - viewController = [viewController performSelector:@selector(getCurrentViewController)]; - } + viewController = [self getViewControllerTraversingManagers:[MVMCoreUISession sharedGlobal].navigationController.topViewController]; } return viewController; } ++ (UIViewController *)getViewControllerTraversingManagers:(UIViewController *)viewController { + UIViewController *controller = viewController; + while ([controller conformsToProtocol:@protocol(MVMCoreViewManagerProtocol)]) { + controller = [controller performSelector:@selector(getCurrentViewController)]; + } + return controller; +} + + (BOOL)viewContainsAccessiblityFocus:(nonnull UIView *)view { if (!UIAccessibilityIsVoiceOverRunning()) { return NO; From 48d427ec4edd2ce84db768a208086fd1f08d3e67 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Fri, 11 Jun 2021 11:04:47 -0400 Subject: [PATCH 02/10] Managers handle navigation bar nullable --- MVMCoreUI/Containers/NavigationController.swift | 8 ++++---- .../MVMCoreUISplitViewController+Extension.swift | 4 ++-- MVMCoreUI/Utility/MVMCoreUIUtility.h | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/MVMCoreUI/Containers/NavigationController.swift b/MVMCoreUI/Containers/NavigationController.swift index bcbf927e..6176427f 100644 --- a/MVMCoreUI/Containers/NavigationController.swift +++ b/MVMCoreUI/Containers/NavigationController.swift @@ -108,16 +108,16 @@ import UIKit /// Convenience function to return the navigation model of the lowest controller traversing managers public static func getNavigationModel(from viewController: UIViewController) -> NavigationItemModelProtocol? { - let controller = MVMCoreUIUtility.getViewControllerTraversingManagers(viewController) - guard let model = (controller as? PageProtocol)?.pageModel?.navigationBar else { return nil } + guard let controller = MVMCoreUIUtility.getViewControllerTraversingManagers(viewController), + let model = (controller as? PageProtocol)?.pageModel?.navigationBar else { return nil } return model } } extension NavigationController: MVMCoreViewManagerProtocol { // TODO: change this to optional - public func getCurrentViewController() -> UIViewController { - return topViewController! + public func getCurrentViewController() -> UIViewController? { + return topViewController } public func containsPage(withPageType pageType: String?) -> Bool { diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift index 835a2df9..a62a3788 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift @@ -119,8 +119,8 @@ public extension MVMCoreUISplitViewController { } extension MVMCoreUISplitViewController: MVMCoreViewManagerProtocol { - public func getCurrentViewController() -> UIViewController { - navigationController!.getCurrentViewController() + public func getCurrentViewController() -> UIViewController? { + navigationController?.getCurrentViewController() } public func containsPage(withPageType pageType: String?) -> Bool { diff --git a/MVMCoreUI/Utility/MVMCoreUIUtility.h b/MVMCoreUI/Utility/MVMCoreUIUtility.h index 171ebeea..c6959723 100644 --- a/MVMCoreUI/Utility/MVMCoreUIUtility.h +++ b/MVMCoreUI/Utility/MVMCoreUIUtility.h @@ -32,10 +32,10 @@ NS_ASSUME_NONNULL_BEGIN + (UIEdgeInsets)getMarginsForView:(nullable UIView *)view; /// Gets the current visible view controller. Checks presented view controllers first, and then it checks on the NavigationController in the session object. -+ (UIViewController *)getCurrentVisibleController; ++ (nullable UIViewController *)getCurrentVisibleController; /// Gets the first non manager controller. -+ (UIViewController *)getViewControllerTraversingManagers:(UIViewController *)viewController; ++ (nullable UIViewController *)getViewControllerTraversingManagers:(UIViewController *)viewController; /// Checks if the view or any descendents of the view is currently focused for voice over. + (BOOL)viewContainsAccessiblityFocus:(nonnull UIView *)view; From f32aff549a7cb22b263ab70d5143f6da1fdf2ba7 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Fri, 11 Jun 2021 11:47:59 -0400 Subject: [PATCH 03/10] comment --- .../MVMCoreUISplitViewController+Extension.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift index a62a3788..fcd4e821 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift @@ -8,6 +8,7 @@ import Foundation +// Navigation bar update functions public extension MVMCoreUISplitViewController { /// Convenience function. Sets the navigation and split view properties for the view controller. Panel access is determined if view controller is a detail view protocol. From f3f65763fc1c76c14255dd5e4def849ac9802c30 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Tue, 22 Jun 2021 11:55:26 -0400 Subject: [PATCH 04/10] bug fixes --- MVMCoreUI/Containers/NavigationController.swift | 14 ++++++++------ .../MVMCoreUISplitViewController+Extension.swift | 7 ++++--- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/MVMCoreUI/Containers/NavigationController.swift b/MVMCoreUI/Containers/NavigationController.swift index 6176427f..776bfe2a 100644 --- a/MVMCoreUI/Containers/NavigationController.swift +++ b/MVMCoreUI/Containers/NavigationController.swift @@ -130,11 +130,11 @@ extension NavigationController: MVMCoreViewManagerProtocol { } public func newDataReceived(in viewController: UIViewController) { - if viewController == topViewController, - let model = Self.getNavigationModel(from: viewController) { - Self.setNavigationItem(navigationController: self, navigationItemModel: model, viewController: viewController) - Self.setNavigationBarUI(navigationController: self, navigationItemModel: model, viewController: viewController) - } + 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) manager?.newDataReceived?(in: viewController) } @@ -160,7 +160,6 @@ extension NavigationController: MVMCorePresentationDelegateProtocol { guard self == navigationController else { return } if let controller = viewController as? (UIViewController & MVMCoreViewManagerViewControllerProtocol) { MVMCoreViewManagerViewControllerProtocolHelper.helpSetManager(self, viewController: controller) - controller.viewControllerReady?(inManager: self) } if let model = Self.getNavigationModel(from: viewController) { Self.setNavigationItem(navigationController: self, navigationItemModel: model, viewController: viewController) @@ -174,5 +173,8 @@ extension NavigationController: MVMCorePresentationDelegateProtocol { Self.setNavigationBarUI(navigationController: self, navigationItemModel: model, viewController: viewController) } manager?.displayedViewController?(viewController) + if let controller = viewController as? (UIViewController & MVMCoreViewManagerViewControllerProtocol) { + controller.viewControllerReady?(inManager: self) + } } } diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift index fcd4e821..4c389bd3 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift @@ -75,7 +75,7 @@ public extension MVMCoreUISplitViewController { leftItems.append(contentsOf: additionalLeftButtons) } - viewController.navigationItem.setLeftBarButtonItems(leftItems.count > 0 ? leftItems : nil, animated: !DisableAnimations.boolValue) + navigationController.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. @@ -102,7 +102,7 @@ public extension MVMCoreUISplitViewController { rightItems.append(contentsOf: additionalRightButtons) } - viewController.navigationItem.setRightBarButtonItems(rightItems.count > 0 ? rightItems : nil, animated: !DisableAnimations.boolValue) + navigationController.topViewController?.navigationItem.setRightBarButtonItems(rightItems.count > 0 ? rightItems : nil, animated: !DisableAnimations.boolValue) } @objc func navigationBarModelExists() -> Bool { @@ -129,7 +129,8 @@ extension MVMCoreUISplitViewController: MVMCoreViewManagerProtocol { } public func displayedViewController(_ viewController: UIViewController) { - updateNavigationBarFor(viewController: viewController) + guard let controller = MVMCoreUIUtility.getViewControllerTraversingManagers(viewController) else { return } + updateNavigationBarFor(viewController: controller) } public func newDataReceived(in viewController: UIViewController) { From f6c672e22dba34ff4b89f4babc8396b11495a3b1 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Tue, 22 Jun 2021 14:36:52 -0400 Subject: [PATCH 05/10] fix explicit --- .../MVMCoreUISplitViewController+Extension.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift index 4c389bd3..77f9126d 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift @@ -125,7 +125,7 @@ extension MVMCoreUISplitViewController: MVMCoreViewManagerProtocol { } public func containsPage(withPageType pageType: String?) -> Bool { - navigationController!.containsPage(withPageType: pageType) + navigationController?.containsPage(withPageType: pageType) ?? false } public func displayedViewController(_ viewController: UIViewController) { From 5af484daad932b931efa90565148dbc5ce0fe548 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Tue, 22 Jun 2021 14:39:21 -0400 Subject: [PATCH 06/10] remove check --- .../MVMCoreUISplitViewController+Extension.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift index 77f9126d..b7e6ce6d 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift @@ -129,8 +129,7 @@ extension MVMCoreUISplitViewController: MVMCoreViewManagerProtocol { } public func displayedViewController(_ viewController: UIViewController) { - guard let controller = MVMCoreUIUtility.getViewControllerTraversingManagers(viewController) else { return } - updateNavigationBarFor(viewController: controller) + updateNavigationBarFor(viewController: viewController) } public func newDataReceived(in viewController: UIViewController) { From 4bdd6fa775c93d138b8825f48d4890285ceecd2a Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Tue, 22 Jun 2021 17:00:52 -0400 Subject: [PATCH 07/10] flow fixes for manager propagation. Navigation fixes. --- .../Containers/NavigationController.swift | 51 +++++++++++-------- ...MCoreUISplitViewController+Extension.swift | 23 +++++---- .../MVMCoreUISplitViewController.m | 8 +-- 3 files changed, 46 insertions(+), 36 deletions(-) diff --git a/MVMCoreUI/Containers/NavigationController.swift b/MVMCoreUI/Containers/NavigationController.swift index 776bfe2a..eb378b08 100644 --- a/MVMCoreUI/Containers/NavigationController.swift +++ b/MVMCoreUI/Containers/NavigationController.swift @@ -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) } diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift index b7e6ce6d..b1d1deac 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift @@ -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) } } diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m index ab44e181..5cc7156d 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m @@ -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]; From eb94c7eaff5b1ef33c3610209c74e944b1b972f1 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Tue, 22 Jun 2021 17:54:35 -0400 Subject: [PATCH 08/10] undo needless change --- .../SplitViewController/MVMCoreUISplitViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m index 5cc7156d..20f0d227 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m @@ -991,7 +991,7 @@ CGFloat const PanelAnimationDuration = 0.2; - (void)resetDrawers { if (!self.navigationItemViewController) { return; } if ([self navigationBarModelExists]) { - [self updateNavigationBarForViewController:[MVMCoreUIUtility getViewControllerTraversingManagers:self.navigationItemViewController]]; + [self updateNavigationBarForViewController:self.navigationItemViewController]; } else { // Legacy [self setLeftPanelIsAccessible:self.leftPanelIsAccessible forViewController:self.navigationItemViewController updateNavigationButtons:YES]; From 91df3b197d9ea47ab306da45943016bd26b5d903 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Wed, 23 Jun 2021 10:18:08 -0400 Subject: [PATCH 09/10] comment fix --- .../MVMCoreUISplitViewController+Extension.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift index b1d1deac..bb1b24d5 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift @@ -114,7 +114,7 @@ public extension MVMCoreUISplitViewController { return true } - /// Convenience function to update the navigation bar for the + /// Convenience function to update the navigation bar if the controller is the current lowest controller. @objc func updateNavigationBarFor(viewController: UIViewController) { guard let navigationController = navigationController, let model = navigationController.getNavigationModel(from: viewController) else { return } From c79b687be3eb5a7e37fbae51b2a07ac223293d70 Mon Sep 17 00:00:00 2001 From: "Christiano, Kevin" Date: Tue, 29 Jun 2021 20:04:21 +0000 Subject: [PATCH 10/10] Updating registry for logging --- .../OtherHandlers/CoreUIModelMapping.swift | 351 +++++++++--------- 1 file changed, 174 insertions(+), 177 deletions(-) diff --git a/MVMCoreUI/OtherHandlers/CoreUIModelMapping.swift b/MVMCoreUI/OtherHandlers/CoreUIModelMapping.swift index 45d1b0c4..f45d3aac 100644 --- a/MVMCoreUI/OtherHandlers/CoreUIModelMapping.swift +++ b/MVMCoreUI/OtherHandlers/CoreUIModelMapping.swift @@ -20,229 +20,226 @@ open class CoreUIModelMapping: ModelMapping { open class func registerMolecules() { // MARK:- Stacks - try? ModelRegistry.register(handler: MoleculeStackView.self, for: StackModel.self) - try? ModelRegistry.register(handler: UnOrderedList.self, for: UnOrderedListModel.self) - try? ModelRegistry.register(handler: NumberedList.self, for: NumberedListModel.self) + ModelRegistry.register(handler: MoleculeStackView.self, for: StackModel.self) + ModelRegistry.register(handler: UnOrderedList.self, for: UnOrderedListModel.self) + ModelRegistry.register(handler: NumberedList.self, for: NumberedListModel.self) // MARK:- Label - try? ModelRegistry.register(handler: Label.self, for: LabelModel.self) + ModelRegistry.register(handler: Label.self, for: LabelModel.self) // MARK:- TextView - try? ModelRegistry.register(handler: TextViewEntryField.self, for: TextViewEntryFieldModel.self) + ModelRegistry.register(handler: TextViewEntryField.self, for: TextViewEntryFieldModel.self) // MARK:- Buttons - try? ModelRegistry.register(handler: PillButton.self, for: ButtonModel.self) - try? ModelRegistry.register(handler: TwoButtonView.self, for: TwoButtonViewModel.self) - try? ModelRegistry.register(handler: ExternalLink.self, for: ExternalLinkModel.self) - try? ModelRegistry.register(handler: Link.self, for: LinkModel.self) - try? ModelRegistry.register(handler: CaretLink.self, for: CaretLinkModel.self) + ModelRegistry.register(handler: PillButton.self, for: ButtonModel.self) + ModelRegistry.register(handler: TwoButtonView.self, for: TwoButtonViewModel.self) + ModelRegistry.register(handler: ExternalLink.self, for: ExternalLinkModel.self) + ModelRegistry.register(handler: Link.self, for: LinkModel.self) + ModelRegistry.register(handler: CaretLink.self, for: CaretLinkModel.self) // MARK:- Entry Field - try? ModelRegistry.register(handler: TextEntryField.self, for: TextEntryFieldModel.self) - try? ModelRegistry.register(handler: MdnEntryField.self, for: MdnEntryFieldModel.self) - try? ModelRegistry.register(handler: DigitEntryField.self, for: DigitEntryFieldModel.self) - try? ModelRegistry.register(handler: ItemDropdownEntryField.self, for: ItemDropdownEntryFieldModel.self) - try? ModelRegistry.register(handler: DateDropdownEntryField.self, for: DateDropdownEntryFieldModel.self) - try? ModelRegistry.register(handler: MultiItemDropdownEntryField.self, for: MultiItemDropdownEntryFieldModel.self) + ModelRegistry.register(handler: TextEntryField.self, for: TextEntryFieldModel.self) + ModelRegistry.register(handler: MdnEntryField.self, for: MdnEntryFieldModel.self) + ModelRegistry.register(handler: DigitEntryField.self, for: DigitEntryFieldModel.self) + ModelRegistry.register(handler: ItemDropdownEntryField.self, for: ItemDropdownEntryFieldModel.self) + ModelRegistry.register(handler: DateDropdownEntryField.self, for: DateDropdownEntryFieldModel.self) + ModelRegistry.register(handler: MultiItemDropdownEntryField.self, for: MultiItemDropdownEntryFieldModel.self) // MARK:- Selectors - try? ModelRegistry.register(handler: RadioButton.self, for: RadioButtonModel.self) - try? ModelRegistry.register(handler: RadioBoxes.self, for: RadioBoxesModel.self) - try? ModelRegistry.register(handler: Checkbox.self, for: CheckboxModel.self) - try? ModelRegistry.register(handler: RadioSwatches.self, for: RadioSwatchesModel.self) - try? ModelRegistry.register(handler: Tags.self, for: TagsModel.self) - try? ModelRegistry.register(handler: Tag.self, for: TagModel.self) - try? ModelRegistry.register(handler: Heart.self, for: HeartModel.self) - try? ModelRegistry.register(handler: Stars.self, for: StarsModel.self) - try? ModelRegistry.register(handler: Star.self, for: StarModel.self) - - + ModelRegistry.register(handler: RadioButton.self, for: RadioButtonModel.self) + ModelRegistry.register(handler: RadioBoxes.self, for: RadioBoxesModel.self) + ModelRegistry.register(handler: Checkbox.self, for: CheckboxModel.self) + ModelRegistry.register(handler: RadioSwatches.self, for: RadioSwatchesModel.self) + ModelRegistry.register(handler: Tags.self, for: TagsModel.self) + ModelRegistry.register(handler: Tag.self, for: TagModel.self) + ModelRegistry.register(handler: Heart.self, for: HeartModel.self) + ModelRegistry.register(handler: Stars.self, for: StarsModel.self) + ModelRegistry.register(handler: Star.self, for: StarModel.self) + // MARK:- Other Atoms - try? ModelRegistry.register(handler: ProgressBar.self, for: ProgressBarModel.self) - try? ModelRegistry.register(handler: MultiProgress.self, for: MultiProgressBarModel.self) - try? ModelRegistry.register(handler: CaretView.self, for: CaretViewModel.self) - try? ModelRegistry.register(handler: DashLine.self, for: DashLineModel.self) - try? ModelRegistry.register(handler: LoadImageView.self, for: ImageViewModel.self) - try? ModelRegistry.register(handler: Line.self, for: LineModel.self) - try? ModelRegistry.register(handler: Wheel.self, for: WheelModel.self) - try? ModelRegistry.register(handler: Toggle.self, for: ToggleModel.self) - try? ModelRegistry.register(handler: CheckboxLabel.self, for: CheckboxLabelModel.self) - try? ModelRegistry.register(handler: Arrow.self, for: ArrowModel.self) - try? ModelRegistry.register(handler: RadioButtonLabel.self, for: RadioButtonLabelModel.self) - try? ModelRegistry.register(handler: WebView.self, for: WebViewModel.self) - try? ModelRegistry.register(handler: LoadingSpinner.self, for: LoadingSpinnerModel.self) - try? ModelRegistry.register(handler: Video.self, for: VideoModel.self) + ModelRegistry.register(handler: ProgressBar.self, for: ProgressBarModel.self) + ModelRegistry.register(handler: MultiProgress.self, for: MultiProgressBarModel.self) + ModelRegistry.register(handler: CaretView.self, for: CaretViewModel.self) + ModelRegistry.register(handler: DashLine.self, for: DashLineModel.self) + ModelRegistry.register(handler: LoadImageView.self, for: ImageViewModel.self) + ModelRegistry.register(handler: Line.self, for: LineModel.self) + ModelRegistry.register(handler: Wheel.self, for: WheelModel.self) + ModelRegistry.register(handler: Toggle.self, for: ToggleModel.self) + ModelRegistry.register(handler: CheckboxLabel.self, for: CheckboxLabelModel.self) + ModelRegistry.register(handler: Arrow.self, for: ArrowModel.self) + ModelRegistry.register(handler: RadioButtonLabel.self, for: RadioButtonLabelModel.self) + ModelRegistry.register(handler: WebView.self, for: WebViewModel.self) + ModelRegistry.register(handler: LoadingSpinner.self, for: LoadingSpinnerModel.self) + ModelRegistry.register(handler: Video.self, for: VideoModel.self) // MARK:- Horizontal Combination Molecules - try? ModelRegistry.register(handler: StringAndMoleculeView.self, for: StringAndMoleculeModel.self) - try? ModelRegistry.register(handler: ImageHeadlineBody.self, for: ImageHeadlineBodyModel.self) - try? ModelRegistry.register(handler: Tabs.self, for: TabsModel.self) - try? ModelRegistry.register(handler: TwoLinkView.self, for: TwoLinkViewModel.self) + ModelRegistry.register(handler: StringAndMoleculeView.self, for: StringAndMoleculeModel.self) + ModelRegistry.register(handler: ImageHeadlineBody.self, for: ImageHeadlineBodyModel.self) + ModelRegistry.register(handler: Tabs.self, for: TabsModel.self) + ModelRegistry.register(handler: TwoLinkView.self, for: TwoLinkViewModel.self) // MARK:- Vertical Combination Molecules - try? ModelRegistry.register(handler: HeadlineBody.self, for: HeadlineBodyModel.self) - try? ModelRegistry.register(handler: HeadLineBodyCaretLinkImage.self, for: HeadlineBodyCaretLinkImageModel.self) - try? ModelRegistry.register(handler: EyebrowHeadlineBodyLink.self, for: EyebrowHeadlineBodyLinkModel.self) - try? ModelRegistry.register(handler: HeadlineBodyLink.self, for: HeadlineBodyLinkModel.self) - try? ModelRegistry.register(handler: HeadlineBodyButton.self, for: HeadlineBodyButtonModel.self) - try? ModelRegistry.register(handler: BGImageHeadlineBodyButton.self, for: BGImageHeadlineBodyButtonModel.self) - try? ModelRegistry.register(handler: ThreeHeadlineBodyLink.self, for: ThreeHeadlineBodyLinkModel.self) - + ModelRegistry.register(handler: HeadlineBody.self, for: HeadlineBodyModel.self) + ModelRegistry.register(handler: HeadLineBodyCaretLinkImage.self, for: HeadlineBodyCaretLinkImageModel.self) + ModelRegistry.register(handler: EyebrowHeadlineBodyLink.self, for: EyebrowHeadlineBodyLinkModel.self) + ModelRegistry.register(handler: HeadlineBodyLink.self, for: HeadlineBodyLinkModel.self) + ModelRegistry.register(handler: HeadlineBodyButton.self, for: HeadlineBodyButtonModel.self) + ModelRegistry.register(handler: BGImageHeadlineBodyButton.self, for: BGImageHeadlineBodyButtonModel.self) + ModelRegistry.register(handler: ThreeHeadlineBodyLink.self, for: ThreeHeadlineBodyLinkModel.self) + // MARK:- Left Right Molecules - try? ModelRegistry.register(handler: CornerLabels.self, for: CornerLabelsModel.self) - try? ModelRegistry.register(handler: LeftRightLabelView.self, for: LeftRightLabelModel.self) - try? ModelRegistry.register(handler: LabelToggle.self, for: LabelToggleModel.self) - try? ModelRegistry.register(handler: HeadlineBodyToggle.self, for: HeadlineBodyToggleModel.self) - try? ModelRegistry.register(handler: HeadlineBodyLinkToggle.self, for: HeadlineBodyLinkToggleModel.self) - try? ModelRegistry.register(handler: ActionDetailWithImage.self, for: ActionDetailWithImageModel.self) - + ModelRegistry.register(handler: CornerLabels.self, for: CornerLabelsModel.self) + ModelRegistry.register(handler: LeftRightLabelView.self, for: LeftRightLabelModel.self) + ModelRegistry.register(handler: LabelToggle.self, for: LabelToggleModel.self) + ModelRegistry.register(handler: HeadlineBodyToggle.self, for: HeadlineBodyToggleModel.self) + ModelRegistry.register(handler: HeadlineBodyLinkToggle.self, for: HeadlineBodyLinkToggleModel.self) + ModelRegistry.register(handler: ActionDetailWithImage.self, for: ActionDetailWithImageModel.self) + // MARK:- List items - try? ModelRegistry.register(handler: MoleculeTableViewCell.self, for: MoleculeListItemModel.self) - try? ModelRegistry.register(handler: DropDownFilterTableViewCell.self, for: DropDownListItemModel.self) - try? ModelRegistry.register(handler: AccordionMoleculeTableViewCell.self, for: AccordionListItemModel.self) - try? ModelRegistry.register(handler: TabsTableViewCell.self, for: TabsListItemModel.self) - try? ModelRegistry.register(handler: ListProgressBarData.self, for: ListProgressBarDataModel.self) + ModelRegistry.register(handler: MoleculeTableViewCell.self, for: MoleculeListItemModel.self) + ModelRegistry.register(handler: DropDownFilterTableViewCell.self, for: DropDownListItemModel.self) + ModelRegistry.register(handler: AccordionMoleculeTableViewCell.self, for: AccordionListItemModel.self) + ModelRegistry.register(handler: TabsTableViewCell.self, for: TabsListItemModel.self) + ModelRegistry.register(handler: ListProgressBarData.self, for: ListProgressBarDataModel.self) // MARK:- Other Items - try? ModelRegistry.register(handler: MoleculeStackItem.self, for: MoleculeStackItemModel.self) - try? ModelRegistry.register(handler: StackItem.self, for: StackItemModel.self) - try? ModelRegistry.register(handler: MoleculeCollectionViewCell.self, for: MoleculeCollectionItemModel.self) - try? ModelRegistry.register(handler: CarouselItem.self, for: CarouselItemModel.self) - - + ModelRegistry.register(handler: MoleculeStackItem.self, for: MoleculeStackItemModel.self) + ModelRegistry.register(handler: StackItem.self, for: StackItemModel.self) + ModelRegistry.register(handler: MoleculeCollectionViewCell.self, for: MoleculeCollectionItemModel.self) + ModelRegistry.register(handler: CarouselItem.self, for: CarouselItemModel.self) + // MARK:- Other Container Molecules - try? ModelRegistry.register(handler: MoleculeContainer.self, for: MoleculeContainerModel.self) - try? ModelRegistry.register(handler: MoleculeHeaderView.self, for: MoleculeHeaderModel.self) - try? ModelRegistry.register(handler: FooterView.self, for: FooterModel.self) - try? ModelRegistry.register(handler: Scroller.self, for: ScrollerModel.self) - try? ModelRegistry.register(handler: ModuleMolecule.self, for: ModuleMoleculeModel.self) - try? ModelRegistry.register(handler: BGImageMolecule.self, for: BGImageMoleculeModel.self) - try? ModelRegistry.register(handler: BGVideoImageMolecule.self, for: BGVideoImageMoleculeModel.self) - try? ModelRegistry.register(handler: MoleculeSectionHeader.self, for: MoleculeSectionHeaderModel.self) - try? ModelRegistry.register(handler: MoleculeSectionFooter.self, for: MoleculeSectionFooterModel.self) - - + ModelRegistry.register(handler: MoleculeContainer.self, for: MoleculeContainerModel.self) + ModelRegistry.register(handler: MoleculeHeaderView.self, for: MoleculeHeaderModel.self) + ModelRegistry.register(handler: FooterView.self, for: FooterModel.self) + ModelRegistry.register(handler: Scroller.self, for: ScrollerModel.self) + ModelRegistry.register(handler: ModuleMolecule.self, for: ModuleMoleculeModel.self) + ModelRegistry.register(handler: BGImageMolecule.self, for: BGImageMoleculeModel.self) + ModelRegistry.register(handler: BGVideoImageMolecule.self, for: BGVideoImageMoleculeModel.self) + ModelRegistry.register(handler: MoleculeSectionHeader.self, for: MoleculeSectionHeaderModel.self) + ModelRegistry.register(handler: MoleculeSectionFooter.self, for: MoleculeSectionFooterModel.self) + // MARK:- Other Molecules - try? ModelRegistry.register(handler: DoughnutChartView.self, for: DoughnutChartModel.self) + ModelRegistry.register(handler: DoughnutChartView.self, for: DoughnutChartModel.self) // Navigation Molecules - try? ModelRegistry.register(NavigationItemModel.self) - try? ModelRegistry.register(NavigationImageButtonModel.self) - try? ModelRegistry.register(NavigationLabelButtonModel.self) - + ModelRegistry.register(NavigationItemModel.self) + ModelRegistry.register(NavigationImageButtonModel.self) + ModelRegistry.register(NavigationLabelButtonModel.self) + // MARK:- Other Organisms - try? ModelRegistry.register(handler: Carousel.self, for: CarouselModel.self) - try? ModelRegistry.register(handler: BarsIndicatorView.self, for: BarsCarouselIndicatorModel.self) - try? ModelRegistry.register(handler: NumericIndicatorView.self, for: NumericCarouselIndicatorModel.self) + ModelRegistry.register(handler: Carousel.self, for: CarouselModel.self) + ModelRegistry.register(handler: BarsIndicatorView.self, for: BarsCarouselIndicatorModel.self) + ModelRegistry.register(handler: NumericIndicatorView.self, for: NumericCarouselIndicatorModel.self) // MARK:- Designed List Items - try? ModelRegistry.register(handler: ListLeftVariableIconWithRightCaret.self, for: ListLeftVariableIconWithRightCaretModel.self) - try? ModelRegistry.register(handler: ListLeftVariableIconWithRightCaretBodyText.self, for: ListLeftVariableIconWithRightCaretBodyTextModel.self) - try? ModelRegistry.register(handler: ListLeftVariableIconWithRightCaretAllTextLinks.self, for: ListLeftVariableIconWithRightCaretAllTextLinksModel.self) - try? ModelRegistry.register(handler: ListLeftVariableCheckboxAllTextAndLinks.self, for: ListLeftVariableCheckboxAllTextAndLinksModel.self) - try? ModelRegistry.register(handler: ListLeftVariableRadioButtonAndPaymentMethod.self, for: ListLeftVariableRadioButtonAndPaymentMethodModel.self) - try? ModelRegistry.register(handler: ListLeftVariableRadioButtonBodyText.self, for: ListLeftVariableRadioButtonBodyTextModel.self) - try? ModelRegistry.register(handler: ListLeftVariableRadioButtonAllTextAndLinks.self, for: ListLeftVariableRadioButtonAllTextAndLinksModel.self) - try? ModelRegistry.register(handler: ListLeftVariableCheckboxBodyText.self, for: ListLeftVariableCheckboxBodyTextModel.self) - try? ModelRegistry.register(handler: ListLeftVariableIconAllTextLinks.self, for: ListLeftVariableIconAllTextLinksModel.self) - try? ModelRegistry.register(handler: ListLeftVariableNumberedListAllTextAndLinks.self, for: ListLeftVariableNumberedListAllTextAndLinksModel.self) - try? ModelRegistry.register(handler: ListLeftVariableNumberedListBodyText.self, for: ListLeftVariableNumberedListBodyTextModel.self) - try? ModelRegistry.register(handler: ListRVWheel.self, for: ListRVWheelModel.self) - try? ModelRegistry.register(handler: ListRightVariablePayments.self, for: ListRightVariablePaymentsModel.self) - try? ModelRegistry.register(handler: ListRightVariableTotalData.self, for: ListRightVariableTotalDataModel.self) - try? ModelRegistry.register(handler: ListRightVariableTextLinkAllTextAndLinks.self, for: ListRightVariableTextLinkAllTextAndLinksModel.self) - try? ModelRegistry.register(handler: ListRightVariableButtonAllTextAndLinks.self, for: ListRightVariableButtonAllTextAndLinksModel.self) - try? ModelRegistry.register(handler: ListRightVariablePriceChangeBodyText.self, for: ListRightVariablePriceChangeBodyTextModel.self) - try? ModelRegistry.register(handler: ListRightVariablePriceChangeAllTextAndLinks.self, for: ListRightVariablePriceChangeAllTextAndLinksModel.self) - try? ModelRegistry.register(handler: ListRightVariableToggleAllTextAndLinks.self, for: ListRightVariableToggleAllTextAndLinksModel.self) - try? ModelRegistry.register(handler: ListRightVariableRightCaretAllTextAndLinks.self, for: ListRightVariableRightCaretAllTextAndLinksModel.self) - try? ModelRegistry.register(handler: ListOneColumnFullWidthTextAllTextAndLinks.self, for: ListOneColumnFullWidthTextAllTextAndLinksModel.self) - try? ModelRegistry.register(handler: ListOneColumnFullWidthTextBodyText.self, for: ListOneColumnFullWidthTextBodyTextModel.self) - try? ModelRegistry.register(handler: ListTwoColumnCompareChanges.self, for: ListTwoColumnCompareChangesModel.self) - try? ModelRegistry.register(handler: ListTwoColumnPriceDetails.self, for: ListTwoColumnPriceDetailsModel.self) - try? ModelRegistry.register(handler: ListTwoColumnPriceDescription.self, for: ListTwoColumnPriceDescriptionModel.self) - try? ModelRegistry.register(handler: ListTwoColumnDropdownSelectors.self, for: ListTwoColumnDropdownSelectorsModel.self) - try? ModelRegistry.register(handler: ListThreeColumnInternationalData.self, for: ListThreeColumnInternationalDataModel.self) - try? ModelRegistry.register(handler: ListThreeColumnDataUsage.self, for: ListThreeColumnDataUsageModel.self) - try? ModelRegistry.register(handler: ListThreeColumnBillChanges.self, for: ListThreeColumnBillChangesModel.self) - try? ModelRegistry.register(handler: ListThreeColumnBillHistory.self, for: ListThreeColumnBillHistoryModel.self) - try? ModelRegistry.register(handler: ListThreeColumnSpeedTest.self, for: ListThreeColumnSpeedTestModel.self) - try? ModelRegistry.register(handler: ListFourColumnDataUsageListItem.self, for: ListFourColumnDataUsageListItemModel.self) - try? ModelRegistry.register(handler: ListProgressBarThin.self, for: ListProgressBarThinModel.self) - try? ModelRegistry.register(handler: ListStoreLocator.self, for: ListStoreLocatorModel.self) - try? ModelRegistry.register(handler: ListStarRating.self, for: ListStarRatingModel.self) + ModelRegistry.register(handler: ListLeftVariableIconWithRightCaret.self, for: ListLeftVariableIconWithRightCaretModel.self) + ModelRegistry.register(handler: ListLeftVariableIconWithRightCaretBodyText.self, for: ListLeftVariableIconWithRightCaretBodyTextModel.self) + ModelRegistry.register(handler: ListLeftVariableIconWithRightCaretAllTextLinks.self, for: ListLeftVariableIconWithRightCaretAllTextLinksModel.self) + ModelRegistry.register(handler: ListLeftVariableCheckboxAllTextAndLinks.self, for: ListLeftVariableCheckboxAllTextAndLinksModel.self) + ModelRegistry.register(handler: ListLeftVariableRadioButtonAndPaymentMethod.self, for: ListLeftVariableRadioButtonAndPaymentMethodModel.self) + ModelRegistry.register(handler: ListLeftVariableRadioButtonBodyText.self, for: ListLeftVariableRadioButtonBodyTextModel.self) + ModelRegistry.register(handler: ListLeftVariableRadioButtonAllTextAndLinks.self, for: ListLeftVariableRadioButtonAllTextAndLinksModel.self) + ModelRegistry.register(handler: ListLeftVariableCheckboxBodyText.self, for: ListLeftVariableCheckboxBodyTextModel.self) + ModelRegistry.register(handler: ListLeftVariableIconAllTextLinks.self, for: ListLeftVariableIconAllTextLinksModel.self) + ModelRegistry.register(handler: ListLeftVariableNumberedListAllTextAndLinks.self, for: ListLeftVariableNumberedListAllTextAndLinksModel.self) + ModelRegistry.register(handler: ListLeftVariableNumberedListBodyText.self, for: ListLeftVariableNumberedListBodyTextModel.self) + ModelRegistry.register(handler: ListRVWheel.self, for: ListRVWheelModel.self) + ModelRegistry.register(handler: ListRightVariablePayments.self, for: ListRightVariablePaymentsModel.self) + ModelRegistry.register(handler: ListRightVariableTotalData.self, for: ListRightVariableTotalDataModel.self) + ModelRegistry.register(handler: ListRightVariableTextLinkAllTextAndLinks.self, for: ListRightVariableTextLinkAllTextAndLinksModel.self) + ModelRegistry.register(handler: ListRightVariableButtonAllTextAndLinks.self, for: ListRightVariableButtonAllTextAndLinksModel.self) + ModelRegistry.register(handler: ListRightVariablePriceChangeBodyText.self, for: ListRightVariablePriceChangeBodyTextModel.self) + ModelRegistry.register(handler: ListRightVariablePriceChangeAllTextAndLinks.self, for: ListRightVariablePriceChangeAllTextAndLinksModel.self) + ModelRegistry.register(handler: ListRightVariableToggleAllTextAndLinks.self, for: ListRightVariableToggleAllTextAndLinksModel.self) + ModelRegistry.register(handler: ListRightVariableRightCaretAllTextAndLinks.self, for: ListRightVariableRightCaretAllTextAndLinksModel.self) + ModelRegistry.register(handler: ListOneColumnFullWidthTextAllTextAndLinks.self, for: ListOneColumnFullWidthTextAllTextAndLinksModel.self) + ModelRegistry.register(handler: ListOneColumnFullWidthTextBodyText.self, for: ListOneColumnFullWidthTextBodyTextModel.self) + ModelRegistry.register(handler: ListTwoColumnCompareChanges.self, for: ListTwoColumnCompareChangesModel.self) + ModelRegistry.register(handler: ListTwoColumnPriceDetails.self, for: ListTwoColumnPriceDetailsModel.self) + ModelRegistry.register(handler: ListTwoColumnPriceDescription.self, for: ListTwoColumnPriceDescriptionModel.self) + ModelRegistry.register(handler: ListTwoColumnDropdownSelectors.self, for: ListTwoColumnDropdownSelectorsModel.self) + ModelRegistry.register(handler: ListThreeColumnInternationalData.self, for: ListThreeColumnInternationalDataModel.self) + ModelRegistry.register(handler: ListThreeColumnDataUsage.self, for: ListThreeColumnDataUsageModel.self) + ModelRegistry.register(handler: ListThreeColumnBillChanges.self, for: ListThreeColumnBillChangesModel.self) + ModelRegistry.register(handler: ListThreeColumnBillHistory.self, for: ListThreeColumnBillHistoryModel.self) + ModelRegistry.register(handler: ListThreeColumnSpeedTest.self, for: ListThreeColumnSpeedTestModel.self) + ModelRegistry.register(handler: ListFourColumnDataUsageListItem.self, for: ListFourColumnDataUsageListItemModel.self) + ModelRegistry.register(handler: ListProgressBarThin.self, for: ListProgressBarThinModel.self) + ModelRegistry.register(handler: ListStoreLocator.self, for: ListStoreLocatorModel.self) + ModelRegistry.register(handler: ListStarRating.self, for: ListStarRatingModel.self) // MARK:- Designed Section Dividers - try? ModelRegistry.register(handler: ListFourColumnDataUsageDivider.self, for: ListFourColumnDataUsageDividerModel.self) - try? ModelRegistry.register(handler: ListThreeColumnPlanDataDivider.self, for: ListThreeColumnPlanDataDividerModel.self) - try? ModelRegistry.register(handler: ListOneColumnTextWithWhitespaceDividerShort.self, for: ListOneColumnTextWithWhitespaceDividerShortModel.self) - try? ModelRegistry.register(handler: ListOneColumnTextWithWhitespaceDividerTall.self, for: ListOneColumnTextWithWhitespaceDividerTallModel.self) - try? ModelRegistry.register(handler: ListOneColumnFullWidthTextDividerSubsection.self, for: ListOneColumnFullWidthTextDividerSubsectionModel.self) - try? ModelRegistry.register(handler: ListTwoColumnSubsectionDivider.self, for: ListTwoColumnSubsectionDividerModel.self) - try? ModelRegistry.register(handler: ListThreeColumnInternationalDataDivider.self, for: ListThreeColumnInternationalDataDividerModel.self) - try? ModelRegistry.register(handler: ListThreeColumnSpeedTestDivider.self, for: ListThreeColumnSpeedTestDividerModel.self) - try? ModelRegistry.register(handler: ListThreeColumnBillChangesDivider.self, for: ListThreeColumnBillChangesDividerModel.self) - try? ModelRegistry.register(handler: ListThreeColumnDataUsageDivider.self, for: ListThreeColumnDataUsageDividerModel.self) - try? ModelRegistry.register(handler: ListThreeColumnBillHistoryDivider.self, for: ListThreeColumnBillHistoryDividerModel.self) - + ModelRegistry.register(handler: ListFourColumnDataUsageDivider.self, for: ListFourColumnDataUsageDividerModel.self) + ModelRegistry.register(handler: ListThreeColumnPlanDataDivider.self, for: ListThreeColumnPlanDataDividerModel.self) + ModelRegistry.register(handler: ListOneColumnTextWithWhitespaceDividerShort.self, for: ListOneColumnTextWithWhitespaceDividerShortModel.self) + ModelRegistry.register(handler: ListOneColumnTextWithWhitespaceDividerTall.self, for: ListOneColumnTextWithWhitespaceDividerTallModel.self) + ModelRegistry.register(handler: ListOneColumnFullWidthTextDividerSubsection.self, for: ListOneColumnFullWidthTextDividerSubsectionModel.self) + ModelRegistry.register(handler: ListTwoColumnSubsectionDivider.self, for: ListTwoColumnSubsectionDividerModel.self) + ModelRegistry.register(handler: ListThreeColumnInternationalDataDivider.self, for: ListThreeColumnInternationalDataDividerModel.self) + ModelRegistry.register(handler: ListThreeColumnSpeedTestDivider.self, for: ListThreeColumnSpeedTestDividerModel.self) + ModelRegistry.register(handler: ListThreeColumnBillChangesDivider.self, for: ListThreeColumnBillChangesDividerModel.self) + ModelRegistry.register(handler: ListThreeColumnDataUsageDivider.self, for: ListThreeColumnDataUsageDividerModel.self) + ModelRegistry.register(handler: ListThreeColumnBillHistoryDivider.self, for: ListThreeColumnBillHistoryDividerModel.self) + // MARK:- Designed Headers - try? ModelRegistry.register(handler: HeadersH1Button.self, for: HeadersH1ButtonModel.self) - try? ModelRegistry.register(handler: HeadersH1LandingPageHeader.self, for: HeadersH1LandingPageHeaderModel.self) - try? ModelRegistry.register(handler: HeadersH1NoButtonsBodyText.self, for: HeadersH1NoButtonsBodyTextModel.self) - try? ModelRegistry.register(handler: HeadersH2NoButtonsBodyText.self, for: HeadersH2NoButtonsBodyTextModel.self) - try? ModelRegistry.register(handler: HeadersH2TinyButton.self, for: HeadersH2TinyButtonModel.self) - try? ModelRegistry.register(handler: HeadersH2Buttons.self, for: HeadersH2ButtonsModel.self) - try? ModelRegistry.register(handler: HeadersH2PricingTwoRows.self, for: HeadersH2PricingTwoRowsModel.self) - try? ModelRegistry.register(handler: HeadersH2Link.self, for: HeadersH2LinkModel.self) - try? ModelRegistry.register(handler: HeadersH2CaretLink.self, for: HeadersH2CaretLinkModel.self) + ModelRegistry.register(handler: HeadersH1Button.self, for: HeadersH1ButtonModel.self) + ModelRegistry.register(handler: HeadersH1LandingPageHeader.self, for: HeadersH1LandingPageHeaderModel.self) + ModelRegistry.register(handler: HeadersH1NoButtonsBodyText.self, for: HeadersH1NoButtonsBodyTextModel.self) + ModelRegistry.register(handler: HeadersH2NoButtonsBodyText.self, for: HeadersH2NoButtonsBodyTextModel.self) + ModelRegistry.register(handler: HeadersH2TinyButton.self, for: HeadersH2TinyButtonModel.self) + ModelRegistry.register(handler: HeadersH2Buttons.self, for: HeadersH2ButtonsModel.self) + ModelRegistry.register(handler: HeadersH2PricingTwoRows.self, for: HeadersH2PricingTwoRowsModel.self) + ModelRegistry.register(handler: HeadersH2Link.self, for: HeadersH2LinkModel.self) + ModelRegistry.register(handler: HeadersH2CaretLink.self, for: HeadersH2CaretLinkModel.self) // MARK:- Device Items - try? ModelRegistry.register(handler: ListDeviceComplexButtonMedium.self, for: ListDeviceComplexButtonMediumModel.self) - try? ModelRegistry.register(handler: ListDeviceComplexButtonSmall.self, for: ListDeviceComplexButtonSmallModel.self) - - try? ModelRegistry.register(handler: ListDeviceComplexLinkSmall.self, for: ListDeviceComplexLinkSmallModel.self) - try? ModelRegistry.register(handler: ListDeviceComplexLinkMedium.self, for: ListDeviceComplexLinkMediumModel.self) + ModelRegistry.register(handler: ListDeviceComplexButtonMedium.self, for: ListDeviceComplexButtonMediumModel.self) + ModelRegistry.register(handler: ListDeviceComplexButtonSmall.self, for: ListDeviceComplexButtonSmallModel.self) + + ModelRegistry.register(handler: ListDeviceComplexLinkSmall.self, for: ListDeviceComplexLinkSmallModel.self) + ModelRegistry.register(handler: ListDeviceComplexLinkMedium.self, for: ListDeviceComplexLinkMediumModel.self) // MARK:- LockUps - try? ModelRegistry.register(handler: LockUpsPlanNames.self, for: LockUpsPlanNamesModel.self) - try? ModelRegistry.register(handler: LockupsPlanSMLXL.self, for: LockupsPlanSMLXLModel.self) - + ModelRegistry.register(handler: LockUpsPlanNames.self, for: LockUpsPlanNamesModel.self) + ModelRegistry.register(handler: LockupsPlanSMLXL.self, for: LockupsPlanSMLXLModel.self) + // MARK: - Top Notifications - try? ModelRegistry.register(handler: NotificationView.self, for: NotificationModel.self) - try? ModelRegistry.register(handler: CollapsableNotification.self, for: CollapsableNotificationModel.self) + ModelRegistry.register(handler: NotificationView.self, for: NotificationModel.self) + ModelRegistry.register(handler: CollapsableNotification.self, for: CollapsableNotificationModel.self) } open class func registerLabelAttributes() { - try? ModelRegistry.register(LabelAttributeFontModel.self) - try? ModelRegistry.register(LabelAttributeColorModel.self) - try? ModelRegistry.register(LabelAttributeImageModel.self) - try? ModelRegistry.register(LabelAttributeUnderlineModel.self) - try? ModelRegistry.register(LabelAttributeStrikeThroughModel.self) - try? ModelRegistry.register(LabelAttributeActionModel.self) + ModelRegistry.register(LabelAttributeFontModel.self) + ModelRegistry.register(LabelAttributeColorModel.self) + ModelRegistry.register(LabelAttributeImageModel.self) + ModelRegistry.register(LabelAttributeUnderlineModel.self) + ModelRegistry.register(LabelAttributeStrikeThroughModel.self) + ModelRegistry.register(LabelAttributeActionModel.self) } open class func registerBehaviors() { - try? ModelRegistry.register(handler: ScreenBrightnessModifierBehavior.self, for: ScreenBrightnessModifierBehaviorModel.self) - try? ModelRegistry.register(handler: PageGetContactBehavior.self, for: PageGetContactBehaviorModel.self) + ModelRegistry.register(handler: ScreenBrightnessModifierBehavior.self, for: ScreenBrightnessModifierBehaviorModel.self) + ModelRegistry.register(handler: PageGetContactBehavior.self, for: PageGetContactBehaviorModel.self) } open override class func registerActions() { super.registerActions() - try? ModelRegistry.register(ActionPopupModel.self) - try? ModelRegistry.register(ActionAlertModel.self) - try? ModelRegistry.register(ActionTopAlertModel.self) - try? ModelRegistry.register(ActionCollapseNotificationModel.self) - try? ModelRegistry.register(ActionOpenPanelModel.self) - try? ModelRegistry.register(ActionTopNotificationModel.self) + ModelRegistry.register(ActionPopupModel.self) + ModelRegistry.register(ActionAlertModel.self) + ModelRegistry.register(ActionTopAlertModel.self) + ModelRegistry.register(ActionCollapseNotificationModel.self) + ModelRegistry.register(ActionOpenPanelModel.self) + ModelRegistry.register(ActionTopNotificationModel.self) } open class func registerRules() { - try? ModelRegistry.register(RuleRequiredModel.self) - try? ModelRegistry.register(RuleAnyRequiredModel.self) - try? ModelRegistry.register(RuleAnyValueChangedModel.self) - try? ModelRegistry.register(RuleAllValueChangedModel.self) - try? ModelRegistry.register(RuleEqualsModel.self) - try? ModelRegistry.register(RuleEqualsIgnoreCaseModel.self) - try? ModelRegistry.register(RuleRegexModel.self) + ModelRegistry.register(RuleRequiredModel.self) + ModelRegistry.register(RuleAnyRequiredModel.self) + ModelRegistry.register(RuleAnyValueChangedModel.self) + ModelRegistry.register(RuleAllValueChangedModel.self) + ModelRegistry.register(RuleEqualsModel.self) + ModelRegistry.register(RuleEqualsIgnoreCaseModel.self) + ModelRegistry.register(RuleRegexModel.self) } }