【问题标题】:Coordinator Pattern to replace UINavigationController in SplitViewController在 SplitViewController 中替换 UINavigationController 的协调器模式
【发布时间】:2020-05-04 20:42:47
【问题描述】:

我正在实施 协调器模式 来处理我的应用中的导航。理论上,当用户选择不同的类别时,我想设置 splitViewController 以用新的类别替换该类别的现有 navigationController。

当应用程序启动时,协调器按预期运行,并且当我弹出或推送启动时实现的相同 navigationController 时也可以正常工作,我唯一的问题是当我尝试替换整个 navigationControllersplitviewcontroller .

问题:添加新的 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】:

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

    但我的方法帮助我的代码更加模块化。我在我的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 替换为与我正在使用的模块对应的那个,即更适合一般用途。 因为在我的回电中,我可以向根协调器发送用户接下来会感兴趣的所需模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      相关资源
      最近更新 更多