通过按钮可Push ViewController,代理方式却失效的问题排查
问题场景与现象
- 故事板结构:
NavigationController->HomeScreenVC->LogInVC(模态弹出) - 需求:登录成功后,先dismiss
LogInVC,再由HomeScreenVCPushMyAccountVC - 异常现象:通过代理通知
HomeScreenVC登录成功后,代理方法logInSucceded()中的Push操作无效;但按钮触发的Push完全正常,控制台能打印delegate123,说明代理配置无问题
相关代码
func logInSucceded() { print("delegate123") let storyboard = UIStoryboard(name: "Main", bundle: nil) let viewController = storyboard.instantiateViewController(withIdentifier: "MyAccountViewController") as! MyAccountViewController navigationController?.pushViewController(viewController, animated: true) } @IBAction func loginbutton(_ sender: Any) { let storyboard = UIStoryboard(name: "Main", bundle: nil) let viewController = storyboard.instantiateViewController(withIdentifier: "MyAccountViewController") as! MyAccountViewController navigationController?.pushViewController(viewController, animated: true) }
解决思路
调整dismiss与代理调用的顺序
核心问题大概率是代理方法调用时,LogInVC还未完成dismiss操作,此时HomeScreenVC的navigationController处于状态不稳定的状态。需要确保先完成LogInVC的dismiss,再触发Push操作:// 在LogInVC的登录成功逻辑中修改 dismiss(animated: true) { [weak self] in self?.delegate?.logInSucceded() }排查navigationController是否为nil
按钮触发时正常,但代理方法调用时navigationController可能临时为nil。可以在代理方法中添加打印确认:func logInSucceded() { print("delegate123") print("navigationController状态: \(navigationController)") // 确认是否为nil let storyboard = UIStoryboard(name: "Main", bundle: nil) let viewController = storyboard.instantiateViewController(withIdentifier: "MyAccountViewController") as! MyAccountViewController navigationController?.pushViewController(viewController, animated: true) }如果确实为nil,可尝试直接获取根导航控制器来执行Push:
guard let rootNav = UIApplication.shared.windows.first?.rootViewController as? UINavigationController else { return } rootNav.pushViewController(viewController, animated: true)确认HomeScreenVC是否在导航栈顶层
检查代理方法调用时,HomeScreenVC是否还是navigationController的顶层视图控制器。如果有其他页面被Push过,Push操作会指向错误的导航栈。可添加打印排查:func logInSucceded() { print("delegate123") print("当前导航栈视图控制器: \(navigationController?.viewControllers ?? [])") // 后续Push代码 }
内容的提问来源于stack exchange,提问作者Norbinette
相关产品推荐
相关产品推荐

