以下是我以编程方式使用委托示例.代码将消息从一个视图传递到另一个视图控制器.我有两个视图SendMessageController和Receive Message控制器.它正在传回数据的场景.

协议在SendMessageController中定义.

protocol SendMessageDelegate: AnyObject {
    func message(text: String)
}
final class SendMessageController: UIViewController {
        
    weak var delegate: SendMessageDelegate?
    
    

    @objc func button() {
        sendMessage()  
    }

    func sendMessage() {
       let message = “Hello World”
       delegate?.message(text: message)
       print("Delegate is :\(delegate)")
       print("self:\(self)")   
} 

在显示接收消息的消息视图控制器中:

final class ShowMessageController: UIViewController,SendMessageDelegate {
     
    let sendMessageController = SendMessageController() 
     
    override func viewDidLoad() {
        sendMessageController.delegate = self
        print("\(sendMessageController)")
    }
    
    func message(text: String) {
        print(“The message is:\(text)”)
             
    }       
}
  

委托打印空,并且print(self)的内存地址不同于print("(sendMessageController)"). 我以前用过委托,SendVC的内存地址都是一样的,不知道这是怎么回事.

推荐答案

调用时创建的是一个全新的实例

let sendMessageController = SendMessageController()

此实例不是故事板使用segue创建的实例.所以你最终得到了两个不同的SendMessageController:

  • 一个具有正确的委派,但对用户操作不可见
  • 一个是可见的,但没有链接到正确的委托

您应该try 从情节提要中获取正确的实例,而不是创建一个新实例,如下所示:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let nextViewController = segue.destination as? SendMessageController {
        nextViewController.delegate = self
    }
}

⚠️由于您的示例中没有表示sendMessageController的代码,因此您似乎在使用故事板.即使不是,问题也是一样的,但应该有不同的方法来获取正确的实例.

Ios相关问答推荐

Flutter应用程序无法使用IOS/Swift的蓝牙核心库发现某些外围设备

更新Flutter项目时出错:CocoaPods找不到pod webview_flutter_wkwebview的兼容版本""

通过拖动更改视图位置的SwiftUI会引发UI错误

从后台线程调用DispatchObject的方法安全吗?

带有故事板的Xcode 15 UIKit视图可以与#Preview宏一起使用吗?

GraphQL iOS Apollo客户端自动持久化查询导致崩溃

由于已存在同名项目,因此无法将Mapbox.xcframework-ios.sign复制到Signature中

如何在不将应用程序留在SwiftUI上的情况下更改语言?

无法关闭包含字体 Select 器的工作表

为什么在Actor内部使用withTaskGroupwork并行运行?

如何在 SwiftUI 中同时使用 LongPressGesture 和 ScrollView 中的滚动?

Swift/iOS:泛型错误:协议需要嵌套类型V;你想添加它吗?

滚动 swiftUI 列表时,未调用单元格的任务修饰符.怎么修?

使用 Foundation 解压缩文件

卡在 Apple 的 SwiftUI 教程第 5 章(更新应用数据)

iOS 是否支持使用独立 .xib 文件创建的嵌套自定义子视图?

无法将NSTaggedPointerString类型的值转换为NSNumber

在 Swift 中禁用向后滑动手势

为信用卡输入格式化 UITextField,例如 (xxxx xxxx xxxx xxxx)

xcode 5.1:libCordova.a 架构问题