Swift - IBAction vs Delegate vs addTarget



刚刚开始用Xcode学习Swift(经过多年的.NET开发),已经看过一些视频,并注意到人们与UI控件(例如UITextField)交互的不同方式。我看到的三种方式是:

  1. 让ViewController实现相应的控件委派协议(例如UITextFieldDelegate),然后为所需事件实现相应的功能
  2. 从接口生成器创建IBAction
  3. 用controlName.addTarget(…)以编程方式连接处理程序

请有人解释一下每种方法的利弊,以及其中一种方法是否被认为比其他方法更好(在哪种情况下适用)?

任何见解都将不胜感激!

在故事板或xib中"连接"IBAction相当于以编程方式添加目标,实际上只是偏好问题。如果你要使用故事板或xib,通常的做法是将控件连接起来,这样更容易找到。此外,您还需要将IBOutlet连接到您希望能够在代码中访问的控件。

委托方法实际上与您提到的其他两个选项有很大不同。例如,UITextFiled将具有一些可以直接连接的属性和操作,但为了利用大部分功能,您需要实现几个委托方法,例如响应用户键入的每个单独的字符。

以下是一些教程,用于说明连接和委派方法。

委托非常适合在两个对象之间发送和接收数据。它可以用来让类显式地符合协议所需的函数。例如UITableView,它要求您至少允许TableView在这些indexPaths中填充多少行、多少节以及哪些单元格。

1。然而,使用UITextFieldDelegate只是记录所发生事件的一种很好的方式。

2。IBAction只有在您通过接口生成器进行操作时才可用。它链接UIControl(UITextField父类)中的操作,以便您可以获得用户输入/操作事件并在代码中链接它们。使用IBAction简化了您的代码(因为要写的代码更少)

3。addTarget(…)是处理IBAction链接的程序化方法。我的建议是,如果你要使用故事板/界面构建器,请坚持IBAction。如果从情节提要中删除一个对象,它会自动取消目标/动作的链接,这会更容易。

设置目标实际上是UIControl类的一部分,如果你的对象类型不是基于UIView的(或者继承了UIControl的东西),你显然不能使用addTarget(…),但你可以选择使用自定义委托/协议。

UIControl通常用于在用户更改视图时通知对象。本文档中列出了这些事件。

委派/协议设计模式要灵活得多。例如,如果您想通过实现textField(textField:,shouldChangeCharactersInRange:,replacementString:) -> Bool来阻止用户键入符号,那么UIControl实际上只能告诉您文本字段是否已更改。

最新更新