在Swift 3中使用代理的简单示例

当我需要快速学习如何使用委托/协议时,我就了解了他们的高级工作(帮助两个对象相互通信),但是却不了解内部工作原理以及如何在代码中创建它们跟我一样容易 对我来说,我决定做一个简单的项目,用一个视图中的textField中的文本更新一个视图上的标签。

如果您想从头开始,则设置非常简单:

  • 两个ViewController(我将其中一个称为SenderVC,将一个称为ReceiverVC)
  • ReceiverVC是初始视图控制器,顶部带有导航栏,一个导航项和一个UILabel位于视图中心。
  • 导航项应该是SenderVC的序号,SenderVC仅具有文本字段和按钮。
  • 而已!

如果您对此有疑问或想直接委托它,我已经创建了主项目的一个分支作为外壳,其中包含所有UI元素:

https://github.com/almusto/GoodOleDelegate/tree/Shell

创建协议:

在我们的SenderVC中,我们要创建如下协议:

在此协议中,我声明了一个函数,任何想要成为我的代理人(在本例中为SenderVC的代理人)都必须实现,并且还要创建一个名为UpdateLabelTextDelegate类型的变量? 它将存储要成为我的委托并遵守我的协议的对象。

之所以将委托设置为可选,是因为如果没有人希望成为SenderVC的委托,则该值将为nil。

成为代表:

现在,我们已经创建了协议,让我们转到ReceivingVC并设置我们的视图以成为SenderVC的委托。

让我们从上到下进行检查。

首先,我们在UIViewController旁边添加了UpdateLabelTextDelegate。 所有这些说明我(ReceiveVC)将遵守UpdateLabelTextDelegate(协议)。 现在,ReceiveVC已经做到了这一点,它现在必须实现功能updateLabelText,您可以看到我们正在执行。

回到开始。 此处的目标是使用SenderVC中的textField文本更新ReceiveVC上的标签。 为此,SenderVC希望在委托者上调用协议函数,并将其textField文本作为参数传递。 有道理吧? 因此,如果进入函数的参数将是SenderVC的textField,我们希望将ReceiverVC上的标签文本设置为该参数。 这是您在上面的updateLabelText函数中看到的。

我们在这里做的最后一件事实际上是当我们选择SenderVC时将ReceiverVC设置为委托。

发送文字:

我们要做的最后一件事实际上是发送文本。 的代码如下:

正如我在一开始所提到的,我们在SenderVC上有一个按钮可以返回到ReceiverVC。 按下按钮是发生魔术的地方,它在代码方面没有太多意义,但是让我们逐步介绍一下它以帮助我们了解发生了什么。

通常,您需要在此处添加一些代码以检查是否确实存在委托,并且textField中是否确实存在文本,但是对于这个简单的示例,我们不需要这样做。

如果您回想起我们连接到SenderVC的最后一步,则将ReceiverVC设置为委托。 因此,我们知道ReceiverVC已经实现了updateLabelText函数。 在这里,我们只是调用委托的(ReceiverVC)的updateLabelText函数,并将该参数传递给textField的文本。

代码的最后一行只是关闭了视图,因此我们可以回到ReceiverVC。

就是这样! 现在,ReceiverVC上的标签应该具有您在SenderVC上的textField中输入的文本。 完成的项目位于此处:

https://github.com/almusto/GoodOleDelegate