在SplitViewController中替换UINavigationController的协调器模式

问题描述 投票:1回答:1

我正在实现协调器模式以处理我的应用程序中的导航。从理论上讲,当用户选择其他类别时,我想设置splitViewController,用一个新类别替换该类别的现有NavigationController。

[当应用程序启动时,协调器按预期方式运行,当我弹出或推入在启动时实现的相同navigationController时也可以正常工作,我唯一的问题是当我尝试替换navigationController的整个splitviewcontroller时。

问题:添加新的NavigationController不会显示给用户

这是我的实现。

class Coordinator: Navigable, DataCommunicator{
    //MARK: - Navigable Conformable
    typealias UIController = SplitController
    var viewController: UIController
    var childCoordinators: [Coordinatable] = []
    //MARK: - Root Custom setup
    weak var parentCoordinator: RootCoordinator?
    //MARK: - Init
    init(viewController: UIController) {
        self.viewController = viewController
    }

    func start() {
      let categoryNavigationController = CategoryNavigationController()
        let categoryNavigationCoordinator = CategoryNavigationCoordinator(viewController: noteNavigationController)
        categoryNavigationCoordinator.start()
        childCoordinators.append(categoryNavigationCoordinator)
        categoryNavigationController.coordinator = self     
        viewController.viewControllers = [categoryNavigationController]
    }
    func startSearchCategory() {
        childCoordinators.removeLast()
        viewController.navigationController?.popToRootViewController(animated: false)
        viewController.viewControllers.removeLast()

        let searchNavigationController = SearchNavigationController()
        let searchCoordinator = SearchNavigationCoordinator(viewController:searchNavigationController)
        searchCoordinator.start()
        childCoordinators.append(searchCoordinator)
        searchNavigationController.coordinator = self
        searchCoordinator.parentCoordinator = self
        viewController.viewControllers = [searchNavigationController]

    }

}
swift uinavigationcontroller uisplitviewcontroller coordinator-pattern
1个回答
0
投票

更新:我想我以不同的方式达到了预期的行为,但我仍然好奇为什么不能在navigationController中显示masterController的不同UISplitViewController并显示它。

但是我的方法帮助我的代码更加模块化。我在Coordinator协议中添加了以下功能

    func stopChild<T: Coordinatable>(coordinator: T, callback: CoordinatorCallBack?)

并实现了以下功能:

  override func stopChild<T>(coordinator: T, callback: CoordinatorCallBack?) where T : Coordinatable {
        childCoordinators = childCoordinators.filter({$0 !== coordinator})
// Calling parent to stop the child coordinator to roll back to the rootController
        parentCoordinator?.stopChild(coordinator: self, callback: nil)

 }

回滚帮助我实例化了我想要的完整堆栈,而没有尝试为splitViewController添加自定义修改代码,相反,我将整个splitViewController替换为与我正在使用的模块相对应的模块,这更漂亮用于一般用途。因为在我的回叫中,我可以将所需的模块发送给根协调员,用户接下来会对它感兴趣。

© www.soinside.com 2019 - 2024. All rights reserved.