You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过按钮可Push ViewController,代理方式却失效的问题排查

问题场景与现象
  • 故事板结构:NavigationController -> HomeScreenVC -> LogInVC(模态弹出)
  • 需求:登录成功后,先dismiss LogInVC,再由HomeScreenVC Push MyAccountVC
  • 异常现象:通过代理通知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)
}

解决思路

  1. 调整dismiss与代理调用的顺序
    核心问题大概率是代理方法调用时,LogInVC还未完成dismiss操作,此时HomeScreenVC的navigationController处于状态不稳定的状态。需要确保先完成LogInVC的dismiss,再触发Push操作:

    // 在LogInVC的登录成功逻辑中修改
    dismiss(animated: true) { [weak self] in
        self?.delegate?.logInSucceded()
    }
    
  2. 排查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)
    
  3. 确认HomeScreenVC是否在导航栈顶层
    检查代理方法调用时,HomeScreenVC是否还是navigationController的顶层视图控制器。如果有其他页面被Push过,Push操作会指向错误的导航栈。可添加打印排查:

    func logInSucceded() {
        print("delegate123")
        print("当前导航栈视图控制器: \(navigationController?.viewControllers ?? [])")
        // 后续Push代码
    }
    

内容的提问来源于stack exchange,提问作者Norbinette

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:35:08