斯威夫特代表团

时间:2015-07-20 23:09:45

标签: swift class share delegation

我在斯威夫特的代表团周围遇到了麻烦。在阅读了一些指南后,我能够在两个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的目的是什么。

我希望任何有关授权的清晰度。

5 个答案:

答案 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)

图表很简单,但可以帮助您了解正在发生的事情。

diagram

FirstViewController必须符合您定义的DataEnteredDelegate协议(请参阅Sumit的回答)。使用secondVC.delegate = self时,您说的是,对于目标为transition的segue SecondViewController,该delegate实例的属性SecondViewController将设置为这个FirstViewController的实例,因此可以通过SecondViewController协议将FirstViewController中的内容委托给您的DataEnteredDelegate

答案 3 :(得分:0)

代表和议定书

不要试图弄清楚“委托”的字典定义如何符合Swift中的委托概念。它没有。

Swift中的委托是两个参与者之间的协议 - 感知对象和请求对象。 “委托”是“请求对象”。每次看到“委托”时,只要想想“提问者”或“请求者”,它就会更有意义。这是他们的协议......

感应对象(第二视图控制器):

我有一些事件发生的数据。我将发布关于如何访问该数据的指令(协议)。如果你想要它,你必须做三件事。

  1. 您必须在班级类型中声明您的班级遵守我的协议。
  2. 您必须编写我在协议中描述的功能。我不关心这些功能的作用,但功能类型必须与我发布的功能相匹配。
  3. 在您的代码中,您必须设置MY“delegate”(想想“asker”)属性以指向您。 {secondVC.delegate = self}这样我就可以调用你的一个函数来传递数据。
  4. 在那之后,当我得到一些数据时,我会调用你告诉你写的对象中的一个函数。我对您的函数的调用将包含您要查找的数据作为参数之一。 {delegate!.userDidEnterInformation(information)}注意:委托! (问问!)是你。

    委托(请求)对象(第一视图控制器):

    O.K。你已经达成了协议。

答案 4 :(得分:0)

委托 您在 Apple 的框架和库中遇到的另一个非常常见的模式是委托。这个概念很简单,它促进了松散耦合和代码可重用性。如果您在应用程序中使用过表视图,那么您已经熟悉了委托。表视图不负责响应用户交互。它将此任务委托给委托对象。当用户点击 table view 中的一行时,table view 会通知它的委托有关此事件的信息。由委托对象(例如,视图控制器)决定应用程序应如何响应。”.... 作者 Bart Jacobs