簡體   English   中英

用於替換 SplitViewController 中的 UINavigationController 的協調器模式

[英]Coordinator Pattern to replace UINavigationController in SplitViewController

我正在實施協調器模式來處理我的應用程序中的導航。 理論上,當用戶選擇不同的類別時,我想設置 splitViewController 以用新的類別替換該類別的現有導航控制器。

當應用程序啟動協調器按預期運行時,當我彈出或推送在啟動時實現的同一個navigationController splitviewcontroller時也可以正常工作,我唯一的問題是當我嘗試替換splitviewcontroller的整個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]

    }

}

更新:我想我用不同的方法達到了所需的行為,但我仍然很好奇為什么我不能在UISplitViewController中為UISplitViewController顯示不同的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替換為與我正在使用的模塊相對應的那個,這對於通用使用來說更漂亮。 因為在我的回調中,我可以將用戶接下來感興趣的所需模塊發送給根協調器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM