【发布时间】:2020-11-14 06:05:39
【问题描述】:
我最近在学习 Swift。我创建了不同复杂性的项目,但我仍然不明白委派的本质。在我的项目中,我尽量避免它。 我看了各种关于这个主题的视频,阅读文章,但我无法理解授权的本质。 现在我决定花一些时间来解决这个问题,并创建了一个简单的项目来解决这个问题,但我仍然无法得到它。
我想在单击按钮时从 FirstViewController 传递文本到 SecondViewController ,但是这段代码不起作用,是什么原因?我做错了什么?
protocol Protocol {
func fillTheLabel(with text: String)
}
class FirstViewController: UIViewController {
var delegate: Protocol?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func buttonPressed(_ sender: Any) {
let text = "Some Text Here"
delegate?.fillTheLabel(with: text)
}
}
//按钮和SecondViewController之间有一个segway
class SecondViewController: UIViewController, Protocol {
var firstVC: FirstViewController?
@IBOutlet var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
firstVC?.delegate = self
}
func fillTheLabel(with text: String) {
label.text = text
}
}
【问题讨论】:
-
正如 Joakim 告诉你的那样——让一个视图控制器成为另一个视图控制器的委托可能不是使用委托模式的最佳示例。但是,如果您愿意,您可以从 Navigation Controller 堆栈中获取所需的 VC 实例(如果它存在),或者从情节提要中实例化您需要的 VC
-
委托通常不用于在这个方向传递数据。它通常用于另一个方向,将数据从 VC2 传回 VC1。有关示例,请参见 this answer。
-
更好的方法是使用您的 Protocol 和 fillTheLabel 函数创建一个类。为 setText 创建一些公共函数,在此函数中调用“delegate?.fillTheLabel(with:text)”在 VC 上进行类的分配/初始化。将您的 VC 设置为委托。并从 VC 调用类实例上的 setText。在方法 fillTheLabel 中,您将从您的班级获得信息。这样它就可以工作了。
-
老实说,关于方向的信息是没有用的 (vacawama)
-
其实我知道你可以把几个VC组合在一起的方法。甚至几百万,屏幕上的像素区域都有像素,但是,通常您会看到一个 VC,实际上您最初的问题与此无关。将一个 VC 设置为另一个 VC 是一种不好的做法。在这里说话的次数很少。
标签: ios swift delegates delegation