![](/img/trans.png)
[英]Initializing UINavigationController with Coordinator Pattern and Storyboard
[英]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.