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

使用Delegate反向传值时Delegate为nil的问题求助

问题原因分析

你遇到的核心问题是两个SendMessageController实例不是同一个对象:

  • ShowMessageController里let sendMessageController = SendMessageController()是手动创建了一个全新的实例,你给这个实例设置了delegate,但实际界面上跳转过去的SendMessageController是另一个独立的实例(比如从storyboard加载、或其他地方初始化的)。
  • 这就导致你在ShowMessageController里打印的内存地址,和SendMessageController里打印的self地址完全不一样,而实际运行的那个实例的delegate根本没被赋值,自然是nil。
解决方案

根据你跳转SendMessageController的方式,选对应的解决办法:

方式1:纯代码跳转

如果是通过代码push/present跳转,直接在跳转前初始化实例并设置delegate,删掉ShowMessageController里提前创建的无用实例:

final class ShowMessageController: UIViewController, SendMessageDelegate {
    // 移除原来的sendMessageController属性
    
    // 示例:按钮点击触发跳转
    @objc func gotoSendMessagePage() {
        let sendVC = SendMessageController()
        sendVC.delegate = self // 给即将跳转的实例设置delegate
        navigationController?.pushViewController(sendVC, animated: true)
        print("\(sendVC)") // 这个地址会和SendMessageController里的self地址一致
    }
    
    func message(text: String) {
        print("The message is:\(text)")
    }
}

方式2:Storyboard跳转

如果是通过Storyboard的segue跳转,在prepare(for:sender:)方法里获取目标控制器实例并设置delegate:

final class ShowMessageController: UIViewController, SendMessageDelegate {
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // 替换成你实际的segue标识符
        if segue.identifier == "GoToSendMessage", 
           let sendVC = segue.destination as? SendMessageController {
            sendVC.delegate = self // 给即将跳转的实例设置delegate
            print("\(sendVC)") // 这个地址会和SendMessageController里的self地址一致
        }
    }
    
    func message(text: String) {
        print("The message is:\(text)")
    }
}
额外注意点
  • 你已经给SendMessageDelegate加上了: AnyObject,确保了它是类协议,这样delegate用weak修饰能避免循环引用,这部分是正确的。
  • 关键逻辑是:必须给即将展示的那个SendMessageController实例设置delegate,而不是自己随便创建一个没用的实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:17:05