ios - Swift 4.2:无法让简单的委托协议工作
问题描述
第一视图控制器
import UIKit
class FirstViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let secondViewController = SecondViewController()
secondViewController.delegate = self
}
}
extension FirstViewController: DataEnteredDelegate {
func userDidEnterInformation(info: String) {
label.text = info
print("label changed")
}
}
第二视图控制器
import UIKit
protocol DataEnteredDelegate: class {
func userDidEnterInformation(info: String)
}
class SecondViewController: UIViewController {
weak var delegate: DataEnteredDelegate? = nil
@IBOutlet weak var textField: UITextField!
@IBAction func sendTextBackButton(_ sender: UIButton) {
print("button tapped")
delegate?.userDidEnterInformation(info: textField.text!)
}
}
解决方案
除了缺少代表收养
class FirstViewController: UIViewController, DataEnteredDelegate {
如果视图控制器是在情节提要中设计的,它就无法工作。
线
let secondViewController = SecondViewController()
创建一个全新的实例,SecondViewController
该实例不是情节提要中的实例,并且所有出口都未连接。
您必须使用segue,或者您必须实例化并呈现第二个视图控制器以获取对目标控制器的真实引用。
笔记:
就 Swift 协议/委托而言,在控制器之间共享数据是相当客观的。
回调闭包更轻量级和更快捷。
推荐阅读
- java - 如何使用 LiveData 代替 LocalBroadcastManager
- vaadin - Vaadin 14.2:使用 BeforeLeaveListener 拦截注销(使会话无效)
- linux - 无法使用自制软件在 mac 中安装 JQ
- hadoop - 在蜂巢中读取兽人时的时区
- javascript - 使用 pkg 打包 node-express 应用程序时,我无法渲染静态图像
- laravel - Laravel 搜索栏
- amazon-web-services - AWS 代码管道,dockerfile 无法访问环境变量 CODEBUILD_SRC_DIR 和 CODEBUILD_SRC_DIR_SecondarySource
- mongodb - 使用 $inc 更新多个数组元素
- javascript - Django webpack loader:如何引用webpack编译的静态图片
- visual-studio - 我无法在 Visual Studio 2019 xamarin 表单中创建模拟器