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

