Swift Coordinator模式下如何退出子协调器实现登录跳转主界面
Coordinator模式登录切换主界面修正方案
你的核心思路是正确的:父协调器统一管理所有子协调器的生命周期,切换流程时确实需要先移除已完成的LoginCoordinator,再添加主界面TabBarCoordinator,避免内存泄漏和逻辑混乱。你需要修改3处核心代码即可实现需求:
1. 修正LoginCoordinator的gotoHome方法
原代码中你在LoginCoordinator内部自行创建了TabBarCoordinator并作为自己的子协调器,这会导致LoginCoordinator无法被释放,且不符合父协调器统一管理跨流程切换的规则,修改为直接把事件抛给父协调器:
func gotoHome() { // 移除原创建TabBarCoordinator的逻辑,直接调用父层处理方法 userIsLogin() }
2. 修正AppCoordinator的userIsValid方法
原代码中你新建了主界面的导航控制器,但没有替换window的根视图控制器,导致界面不会发生切换,补充逻辑如下:
func userIsValid(_ child:Coordinator?) { // 先移除已完成流程的LoginCoordinator,释放内存 childDidFinnish(child) // 初始化主界面相关协调器 let navigationControler = UINavigationController() let tabBarCoordinator = TabBarCoordinator(navigationController: navigationControler) childCoordinators.append(tabBarCoordinator) tabBarCoordinator.start() // 替换根视图控制器,完成界面切换 window.rootViewController = navigationControler // 可选:添加过渡动画让切换更自然 UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: nil) }
3. childDidFinish方法的使用说明
你当前实现的childDidFinish方法本身逻辑正确,作用是从父协调器的子协调器数组中移除指定的子协调器,已经覆盖了两个需要移除的场景:
- 用户主动登录成功时,通过
parentCoordinator?.userIsValid(self)主动调用该方法移除LoginCoordinator - 用户手势滑动返回/其他触发
LoginViewController被pop的场景,通过导航控制器的didShow代理方法自动移除LoginCoordinator,避免内存泄漏
内容的提问来源于stack exchange,提问作者Farhandika
相关产品推荐
相关产品推荐

