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

Swift 5使用delegate方法触发popToViewController无响应问题咨询

问题原因

你遇到的didLogout方法不执行的核心问题有3个:

  • 弹出ViewController2时,没有给它的delegate属性赋值,导致delegate默认是nil,回调无法触发
  • ViewController1没有显式声明遵守LogoutDelegate协议
  • 协议定义位置不合理,代理协议应该由触发回调的类(也就是ViewController2)持有,当前放在ViewController1中会导致ViewController2无法正常引用协议

修正方案(基于delegate实现)

1. 调整ViewController2(SettingsViewController)代码

将代理协议移到ViewController2中,同时用weak修饰delegate避免循环引用:

// 协议定义移到ViewController2内部
protocol LogoutDelegate: AnyObject {
    func didLogout()
}

class SettingsViewController: UIViewController {
    // 用weak修饰delegate,避免内存泄漏
    weak var delegate: LogoutDelegate?

    func logout() {
        print("Logout")
        self.delegate?.didLogout()
        dismiss(animated: true)
    }
}

2. 调整ViewController1代码

显式声明ViewController1遵守LogoutDelegate协议:

class ViewController1: UIViewController, LogoutDelegate {
    // 原有的didLogout实现保持不变
    func didLogout() {
        print("User Logged Out")
        self.navigationController?.popToRootViewController(animated: true)
    }
}

3. 修正弹出ViewController2的逻辑

创建ViewController2实例后,给它的delegate属性赋值为当前ViewController1实例:

let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Test") as! SettingsViewController
// 新增这行,给delegate赋值
controller.delegate = self
let navigationController = UINavigationController(rootViewController: controller)
navigationController.modalPresentationStyle = .formSheet
self.present(navigationController, animated: true, completion: nil)

额外排查点

如果修改完成后仍未打印User Logged Out,请确认logout方法是否正常触发,比如退出登录按钮的点击事件是否正确绑定到了logout方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:24:01