diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2ButtonsModel.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2ButtonsModel.swift index 3b4d0b7e..9590fefc 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2ButtonsModel.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2ButtonsModel.swift @@ -74,7 +74,7 @@ public class HeadersH2ButtonsModel: HeaderModel, MoleculeModelProtocol, ParentMo required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - titleLockup = try typeContainer.decodeMolecule(codingKey: .titleLockup) + titleLockup = try helper.deprecatedCreate(from: decoder) ?? typeContainer.decodeMolecule(codingKey: .titleLockup) buttons = try typeContainer.decode(TwoButtonViewModel.self, forKey: .buttons) try super.init(from: decoder) } diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2CaretLinkModel.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2CaretLinkModel.swift index 4f7129da..784966cf 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2CaretLinkModel.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2CaretLinkModel.swift @@ -67,7 +67,7 @@ public class HeadersH2CaretLinkModel: HeaderModel, MoleculeModelProtocol, Parent //-------------------------------------------------- required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - titleLockup = try typeContainer.decodeMolecule(codingKey: .titleLockup) + titleLockup = try helper.deprecatedCreate(from: decoder) ?? typeContainer.decodeMolecule(codingKey: .titleLockup) caretLink = try typeContainer.decode(CaretLinkModel.self, forKey: .caretLink) try super.init(from: decoder) } diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2LinkModel.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2LinkModel.swift index 1ec6590d..0a104f9f 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2LinkModel.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2LinkModel.swift @@ -73,7 +73,7 @@ public class HeadersH2LinkModel: HeaderModel, MoleculeModelProtocol, ParentMolec required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - titleLockup = try typeContainer.decodeMolecule(codingKey: .titleLockup) + titleLockup = try helper.deprecatedCreate(from: decoder) ?? typeContainer.decodeMolecule(codingKey: .titleLockup) link = try typeContainer.decode(LinkModel.self, forKey: .link) try super.init(from: decoder) } diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2TinyButtonModel.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2TinyButtonModel.swift index 91a1c472..aba4e48b 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2TinyButtonModel.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/Headers/H2/HeadersH2TinyButtonModel.swift @@ -76,7 +76,7 @@ public class HeadersH2TinyButtonModel: HeaderModel, MoleculeModelProtocol, Paren required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - titleLockup = try typeContainer.decodeMolecule(codingKey: .titleLockup) + titleLockup = try helper.deprecatedCreate(from: decoder) ?? typeContainer.decodeMolecule(codingKey: .titleLockup) button = try typeContainer.decode(ButtonModel.self, forKey: .button) try super.init(from: decoder) } diff --git a/MVMCoreUI/Containers/NavigationController/NavigationController.swift b/MVMCoreUI/Containers/NavigationController/NavigationController.swift index 57f4b5a5..d8d56244 100644 --- a/MVMCoreUI/Containers/NavigationController/NavigationController.swift +++ b/MVMCoreUI/Containers/NavigationController/NavigationController.swift @@ -34,6 +34,7 @@ import Combine public static func setupNavigationControllerAsMainController() -> Self? { guard let navigationController = setupNavigationController() else { return nil } MVMCoreUISession.sharedGlobal()?.setup(asStandardLoadViewDelegate: navigationController) + MVMCoreObject.sharedInstance()?.viewControllerManager = navigationController return navigationController } @@ -136,6 +137,31 @@ extension NavigationController: MVMCoreViewManagerProtocol { public func displayedViewController(_ viewController: UIViewController) { manager?.displayedViewController?(viewController) } + + private func go(to index: Int) async { + guard index != viewControllers.count - 1 else { return } + await NavigationHandler.shared().set(viewControllers: Array(viewControllers[0...index]), navigationController: self) + } + + public func navigate(toViewControllerOfPageType pageType: String, controllerType: AnyClass?) async -> UIViewController? { + for (index, controller) in viewControllers.enumerated() { + if let manager = controller as? MVMCoreViewManagerProtocol, + let viewController = await manager.navigate(toViewControllerOfPageType: pageType, controllerType: controllerType) { + await go(to: index) + return viewController + } else if let controller = controller as? MVMCoreViewControllerProtocol & UIViewController, + controller.pageType == pageType { + guard let controllerType = controllerType else { + await go(to: index) + return controller + } + guard (type(of: controller) == controllerType) else { continue } + await go(to: index) + return controller + } + } + return nil + } } extension UIColor { diff --git a/MVMCoreUI/Containers/NavigationController/UINavigationController+Extension.swift b/MVMCoreUI/Containers/NavigationController/UINavigationController+Extension.swift index 44aa9207..5a3d9a1a 100644 --- a/MVMCoreUI/Containers/NavigationController/UINavigationController+Extension.swift +++ b/MVMCoreUI/Containers/NavigationController/UINavigationController+Extension.swift @@ -102,7 +102,7 @@ public extension UINavigationController { navigationBar.standardAppearance = appearance navigationBar.scrollEdgeAppearance = appearance - setNavigationBarHidden(model.hidden, animated: true) + setNavigationBarHidden(model.hidden, animated: false) } @objc @MainActor diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift index c0420055..549d53a8 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController+Extension.swift @@ -269,6 +269,10 @@ extension MVMCoreUISplitViewController: MVMCoreViewManagerProtocol { public func newDataReceived(in viewController: UIViewController) { updateState(with: viewController) } + + public func navigate(toViewControllerOfPageType pageType: String, controllerType: AnyClass?) async -> UIViewController? { + return await navigationController?.navigate(toViewControllerOfPageType: pageType, controllerType: controllerType) + } } @objc public extension MVMCoreUISplitViewController { diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m index 79c81b8d..453c7d56 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m @@ -95,6 +95,7 @@ CGFloat const PanelAnimationDuration = 0.2; if (topAlertView) { [splitViewController subscribeForNotifications]; } + [MVMCoreObject sharedInstance].viewControllerManager = splitViewController; return splitViewController; } diff --git a/MVMCoreUI/Managers/SubNav/SubNavManagerController.swift b/MVMCoreUI/Managers/SubNav/SubNavManagerController.swift index 741fb830..ed1a7ca1 100644 --- a/MVMCoreUI/Managers/SubNav/SubNavManagerController.swift +++ b/MVMCoreUI/Managers/SubNav/SubNavManagerController.swift @@ -362,6 +362,35 @@ open class SubNavManagerController: ViewController, MVMCoreViewManagerProtocol, manager?.displayedViewController?(viewController) } + private func go(to index: Int) async { + // Load controller from the cache + guard index != self.index, + let controller = viewControllers[index] else { return } + needToTrackTabSelect = true + self.index = index + await NavigationHandler.shared().replace(viewController: controller, navigationController:subNavigationController, delegateObject:delegateObject(), tryToReplace: false, animated: true) + } + + public func navigate(toViewControllerOfPageType pageType: String, controllerType: AnyClass?) async -> UIViewController? { + for (index, controller) in viewControllers.enumerated() { + if let manager = controller as? MVMCoreViewManagerProtocol, + let viewController = await manager.navigate(toViewControllerOfPageType: pageType, controllerType: controllerType) { + await go(to: index) + return viewController + } else if let controller = controller as? MVMCoreViewControllerProtocol & UIViewController, + controller.pageType == pageType { + guard let controllerType = controllerType else { + await go(to: index) + return controller + } + guard (type(of: controller) == controllerType) else { continue } + await go(to: index) + return controller + } + } + return nil + } + // MARK: - MVMCoreUISwipeNavigationProtocol public func swipeLeft() { diff --git a/MVMCoreUI/Utility/MVMCoreUIUtility+Extension.swift b/MVMCoreUI/Utility/MVMCoreUIUtility+Extension.swift index 2f755491..ea91f62b 100644 --- a/MVMCoreUI/Utility/MVMCoreUIUtility+Extension.swift +++ b/MVMCoreUI/Utility/MVMCoreUIUtility+Extension.swift @@ -73,6 +73,7 @@ public extension MVMCoreUIUtility { @objc public extension MVMCoreUIUtility { + /// Returns the current visible viewcontroller. @objc @MainActor static func getVisibleViewController() -> UIViewController? { var viewController = NavigationHandler.shared().getViewControllerToPresentOn()