2015-07-20 77 views
0

我在Swift中缠绕我的头绕着代表团遇到了麻烦。阅读了一些指南之后,我可以在两个ViewController之间设置代理,但我不了解它是如何工作的。在我的第一个视图控制器中,我有一个标签,显示在第二个视图控制器中输入的内容,其中包含文本字段和按钮(返回到第一个视图控制器)。这是第一个视图控制器代码:Swift代表团

@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

顺便说一句,在Swift中,你可以在每行结尾处省略分号。这样你的代码看起来不那么混乱。 :-) – bio

回答

0

您在第二个视图控制器中创建的协议是一个接口。您必须使用DataEnteredDelegate协议实现您的第一个视图控制器。

class FirstViewController:UIViewController, DataEnteredDelegate{ 
    func userDidEnterInformation(info: String) { 
    //stub 
    } 
} 
0

如果第二VC的代表没有在prepareForSegue()设置它仍然nil。第二个VC然后无法呼叫第一个VC。

请注意,如果委托人为nil,您的代码将会崩溃,因为delegate!正试图展开值为nil的可选绑定。最好是先解开委托变量:

if let handler = delegate { 
    handler.userDidEnterInformation(information) 
} 

或者,你可以使用Swift's Optional Chaining,呼吁userDidEnterInformation只有delegatenil

delegate?.userDidEnterInformation(information); 

此外,建议申报委托weak,防止保留周期:

weak var delegate: DataEnteredDelegate? 
0

图是简单的,但可以帮助你了解这是怎么回事。

diagram

FirstViewController必须符合您所定义的DataEnteredDelegate协议(见萨米特的答案)。当使用secondVC.delegate = self,你说,对于SEGUE transition目的地址为一个SecondViewController,即SecondViewController实例的属性delegate将被设置为FirstViewController这种情况下,因此委托的东西从SecondViewControllerFirstViewControllerDataEnteredDelegate协议成为可能。

0

代表和协议

不要揣摩“代表”的字典中的定义是如何与代表团在斯威夫特的理念相符。它没有。

斯威夫特的授权是两个玩家之间的协议 - 一个感应对象和一个请求对象。 “代表”是“请求对象”。每次看到“代表”时,只要想一想“提问者”或“请求者”,它就会变得更有意义。这里是他们的协议...

检测物体(二 - 视图 - 控制器):

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

  1. 你必须在你的类类声明你的类遵守我的协议。
  2. 您必须编写我在协议中描述的功能。我不在乎这些函数做什么,但函数类型必须匹配我发布的内容。
  3. 在你的代码中,你必须设置我的“委托”(认为“提问者”)属性指向你。 {secondVC.delegate = self}这样我可以调用你的一个函数来传递数据。

之后,当我得到一些数据时,我会调用你的对象中我告诉你写的一个函数。我对你的函数的调用将包含你正在寻找的数据作为参数之一。 {delegate!.userDidEnterInformation(information)}注意:委托! (提问者!)是你。

的委派(请求)对象(初视图控制器):

O.K.你有一笔交易。