我在斯威夫特的代表团周围遇到了麻烦。在阅读了一些指南后,我能够在两个ViewControllers之间设置委托,但我不了解它是如何工作的。在我的第一个视图控制器中,我有一个标签,显示在第二个视图控制器中输入的内容,其中包含一个文本字段和一个按钮(返回到第一个视图控制器)。这是第一个视图控制器的代码:
@IBOutlet weak var labelText: UILabel!
func userDidEnterInformation(info: String) {
labelText.text = info;
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "transition"){
let secondVC: SecondViewController = segue.destinationViewController as! SecondViewController;
secondVC.delegate = self;
}
}
这是第二个视图控制器的代码:
protocol DataEnteredDelegate{
func userDidEnterInformation(info: String);
}
@IBOutlet weak var userText: UITextField!
var delegate: DataEnteredDelegate? = nil;
@IBAction func buttonPressed(sender: AnyObject) {
let information = userText.text!;
delegate!.userDidEnterInformation(information);
self.navigationController?.popToRootViewControllerAnimated(true);
}
我的理解是,在文本字段内的文本存储在信息常量中,然后调用协议中的userDidEnterInformation方法,该方法在第一个视图控制器内定义。然后,此方法更改第一个视图控制器内的标签。问题是,我不确定prepareForSegue函数中发生了什么。具体来说,我不确定secondVC.delegate = self的目的是什么。
我希望任何有关授权的清晰度。
答案 0 :(得分:0)
您在第二个viewcontroller中创建的协议是一个接口。您必须使用DataEnteredDelegate协议实现第一个视图控制器。
class FirstViewController:UIViewController, DataEnteredDelegate{
func userDidEnterInformation(info: String) {
//stub
}
}
答案 1 :(得分:0)
如果第二个VC的代表未在prepareForSegue()
中设置,则它仍为nil
。然后第二个VC无法调用第一个VC。
在旁注中,如果委托是nil
,则代码将崩溃,因为delegate!
正在尝试打开具有nil
值的可选绑定。首先解包委托变量最好:
if let handler = delegate {
handler.userDidEnterInformation(information)
}
或者,您可以使用Swift's Optional Chaining,仅在userDidEnterInformation
不是delegate
时才调用nil
。
delegate?.userDidEnterInformation(information);
此外,建议声明委托weak
,以防止保留周期:
weak var delegate: DataEnteredDelegate?
答案 2 :(得分:0)
图表很简单,但可以帮助您了解正在发生的事情。
FirstViewController
必须符合您定义的DataEnteredDelegate
协议(请参阅Sumit的回答)。使用secondVC.delegate = self
时,您说的是,对于目标为transition
的segue SecondViewController
,该delegate
实例的属性SecondViewController
将设置为这个FirstViewController
的实例,因此可以通过SecondViewController
协议将FirstViewController
中的内容委托给您的DataEnteredDelegate
。
答案 3 :(得分:0)
代表和议定书
不要试图弄清楚“委托”的字典定义如何符合Swift中的委托概念。它没有。
Swift中的委托是两个参与者之间的协议 - 感知对象和请求对象。 “委托”是“请求对象”。每次看到“委托”时,只要想想“提问者”或“请求者”,它就会更有意义。这是他们的协议......
感应对象(第二视图控制器):
我有一些事件发生的数据。我将发布关于如何访问该数据的指令(协议)。如果你想要它,你必须做三件事。
在那之后,当我得到一些数据时,我会调用你告诉你写的对象中的一个函数。我对您的函数的调用将包含您要查找的数据作为参数之一。 {delegate!.userDidEnterInformation(information)}注意:委托! (问问!)是你。
委托(请求)对象(第一视图控制器):
O.K。你已经达成了协议。
答案 4 :(得分:0)
委托 您在 Apple 的框架和库中遇到的另一个非常常见的模式是委托。这个概念很简单,它促进了松散耦合和代码可重用性。如果您在应用程序中使用过表视图,那么您已经熟悉了委托。表视图不负责响应用户交互。它将此任务委托给委托对象。当用户点击 table view 中的一行时,table view 会通知它的委托有关此事件的信息。由委托对象(例如,视图控制器)决定应用程序应如何响应。”.... 作者 Bart Jacobs