iOS Swift协调器模式和导航控制器的后退按钮

问题描述 投票:0回答:2

我正在使用模式MVVM+Coordinator。我的每个控制器都是由coordinators创建的。但是,当点击Navigation控制器的后退按钮时,停止协调员的正确方法是什么?

class InStoreMainCoordinator: NavigationCoordinatorType, HasDisposeBag {

    let container: Container

    enum InStoreMainChildCoordinator: String {
        case menu = "Menu"
        case locations = "Locations"
    }

    var navigationController: UINavigationController
    var childCoordinators = [String: CoordinatorType]()

    init(navigationController: UINavigationController, container: Container) {
        self.navigationController = navigationController
        self.container = container
    }

    func start() {
        let inStoreMainViewModel = InStoreMainViewModel()
        let inStoreMainController = InStoreMainController()
        inStoreMainController.viewModel = inStoreMainViewModel

        navigationController.pushViewController(inStoreMainController, animated: true)
    }
}
ios swift mvvm rx-swift coordinator-pattern
2个回答
1
投票

我的方法是使用管理子协调器的根(父)协调器,因此当用户完成一个流或点击后退按钮时,将调用根协调器中的委托方法,它可以清理子协调器并在需要时创建一个新的协调器。


0
投票

协调器模式有关于本机后退按钮的已知盲点。您主要有两种方法来解决它:

  • 重新实现您自己的后退按钮,尽管您松开了本机滑动后退手势以导航回来。
  • 实现UINavigationControllerDelegate以检测何时弹出视图以释放匹配的Coordinator。

关于第一个解决方案,我不建议这个,用户会为你的代码架构付出代价,这听起来不公平。

对于第二个,您可以按照@mosbah的建议将其实现到协调器本身,但是我建议您进一步使用NavigationControllerRouter类将导航分离到协调器以隔离导航本身并保持清晰的分离关注的。

我写了一些关于here的内容,详细介绍了主要步骤。

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