在Swift中开始使用自定义代理的两种方法
您是Swift委派的新手吗? 让我们讨论两种在代码中开始使用委托和协议的好方法。 但是首先,代表是什么?
委托是一种设计模式,当特定事件发生时,该模式允许一个对象与另一个对象进行通信。
委托对象保留对另一个对象(委托人)的引用,并在适当的时间向其发送消息。 这使我们可以更新委托以反映事件的完成。 大!
因此,让我们谈谈开始实现自定义委托的最简单的地方。
- 显示弹出窗口并检测与该窗口的用户交互
要创建一个弹出窗口,请在您的项目文件中添加一个新的CocoaTouch View Controller类,然后选择“还创建XIB文件”框。 这是我们将构建弹出视图的地方。 我们将其命名为“ PopUpViewController”。 这将是我们的委托对象。 在您的.xib文件中,添加两个按钮。 将出口链接到您的PopUpViewController.swift文件。 我们将第一个按钮命名为“ optionAButton”,第二个按钮命名为“ optionBButton”。 目的是从您呈现的视图控制器中检测用户选择哪个选项。 让我们将呈现的视图控制器称为“ MainViewController”。 我们还将这个视图控制器称为我们的委托 。 我们将需要在两个班级之间进行交流-这是委派非常有帮助的地方!
第一步是创建一个协议。 什么是协议? 协议定义了一组功能,属性或其他要求以完成特定任务。 协议可以由类,结构或枚举所采用,而类,结构或枚举又将提供那些要求的实现,并且据说该协议符合该协议。 因此,基本上,协议定义了将委派的职责。
因此,回到我们的代码。 让我们在PopUpViewController.swift文件的顶部添加一个名为“ PopUpDelegate”的协议。 我们将在我们的协议中添加两个功能(认为是“责任”),我们的代表以后将实现这些功能。 它看起来像这样:
您可能会注意到,我们还在PopUpViewController上添加了proxy属性。 这样便可以通过我们的MainViewController对其进行访问。 稍后,您将看到MainViewController将PopUpViewController的委托分配给它自己。
接下来,让我们为两个按钮连接IBAction。
这里要记住的重要一点是IBAction会检测与PopUpViewController的用户交互。 一旦进入该函数,就让委托人知道我们正在调用委托方法。
现在,让我们回到MainViewController并实现我们的委托方法。 (提醒一下,这些方法是在我们的PopUpDelegate协议中定义的,并在我们的PopUpViewController中调用的。现在,该调用它们了,现在该决定做什么了 !)
首先,我们的MainViewController需要符合PopUpDelegate协议。 在类定义之后添加协议,编译器将给您一个错误,指出MainViewController类不符合PopUpDelegate协议。 所以,让我们修复它! 我们将添加PopUpDelegate协议中列出的两个函数。 现在,我们仅打印出已按下特定按钮。
我们仍然没有办法看到我们的PopUpViewController。 因此,让我们在MainViewController中定义PopUpViewController类并推送弹出窗口。 我们将在MainViewController上添加一个按钮,用户可以按下该按钮以显示弹出窗口。 然后,别忘了将PopUpViewController的委托分配给MainViewController的重要步骤!
实施此代码后,您将收到一条错误消息,指出PopUpViewController没有成员“ showInView”。 让我们切换回PopUpViewController并添加该功能。 我们还将在弹出窗口中添加showAnimate()和removeAnimate()函数以及一些自定义动画。
运行项目后,单击按钮A或按钮B,您应该在日志中看到打印出相应的语句,并且弹出窗口应该关闭。 就是这样! 您现在已经成功实现了您的第一个自定义委托。 恭喜你! 作为挑战,请查看是否可以将文本字段中的文本传递回当前的视图控制器。 如果您想查看项目源代码,请访问此处:https://github.com/brittanygraft/DelegatesAndProtocolsTutorial
2)在自定义Tableview单元中检测按钮按下
由于您已经是代表和协议的专业人士,因此我们在本示例中不会做太多详细的介绍,而是使用我们在上一示例中定义的术语。
创建一个自定义表格视图单元格; 这将是我们的授权对象 。 让我们将其命名为CustomTableViewCell。 在表格视图单元.xib文件中添加一个标签和两个按钮,将按钮“调用”和“电子邮件”命名为IBOutlets和IBActions并将它们挂接到您的.swift文件中。
在该类之上创建一个协议; 我们将其命名为ActionButtonDelegate。 在协议内部,添加两个函数:callButtonWasPressed(button:UIButton)和emailButtonWasPressed(button:UIButton)。
将委托属性添加到您的CustomTableViewCell类:
var委托:ActionButtonDelegate?
同样在CustomTableViewCell类中,对于两个按钮中的每个按钮,在IBAction函数内部,调用相应的委托方法:
self.delegate?.callButtonWasPressed(button:按钮)
(这里的“按钮”是发送者。它在IBAction函数中传递)
因此,现在,我们将转到定义了表格视图的类。 我们将这个视图控制器命名为“ MainViewController”; 这是我们的代表 。 使此委托符合ActionButtonDelegate协议,再次您应该得到一个尚未出现的错误。
不过,首先,我们创建一个字典数组,其中将包含所有表视图数据。 我们称之为dataArray。
它看起来像这样:
现在,在表格视图的cellForRowAtIndexPath方法中,像平常一样定义自定义单元格,然后添加以下行:
cell.delegate =自我
这将使MainViewController成为自定义单元的委托。
同样在此方法中,我们还将cell.callButton.tag设置为等于indexPath.row,并将cell.emailButton.tag设置为等于indexPath.row。 它看起来应该像这样:
现在,我们可以实现我们的委托方法。
在这里,您将看到我们添加了button标记,以便我们可以从dataArray中获取适当的字典。 我们将动作添加到我们的委托方法中,就是这样!