我正在使用模式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)
}
}
我的方法是使用管理子协调器的根(父)协调器,因此当用户完成一个流或点击后退按钮时,将调用根协调器中的委托方法,它可以清理子协调器并在需要时创建一个新的协调器。
协调器模式有关于本机后退按钮的已知盲点。您主要有两种方法来解决它:
UINavigationControllerDelegate
以检测何时弹出视图以释放匹配的Coordinator。关于第一个解决方案,我不建议这个,用户会为你的代码架构付出代价,这听起来不公平。
对于第二个,您可以按照@mosbah的建议将其实现到协调器本身,但是我建议您进一步使用NavigationController
或Router
类将导航分离到协调器以隔离导航本身并保持清晰的分离关注的。
我写了一些关于here的内容,详细介绍了主要步骤。