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
相关产品推荐
相关产品推荐

