Swift - IBAction vs Delegate vs addTarget

时间:2016-03-23 05:40:57

标签: ios swift

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

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

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

    非常感谢任何见解!

2 个答案:

答案 0 :(得分:4)

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

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

以下是一些说明wiring updelegate methods的教程。

答案 1 :(得分:1)

代表非常适合在两个对象之间发送和接收数据。它可用于使类明确符合协议所需的功能。例如UITableView,它要求您至少让TableView在这些indexPaths中填充多少行,部分和哪些单元格。

1。 但是使用UITextFieldDelegate它只是记录发生事件的好方法。

2。 IBAction仅在您通过界面构建​​器执行操作时可用。它链接UIControl(UITextField父类)中的操作,以便您可以获取用户输入/操作事件并将其链接到代码中。使用IBAction简化了代码(因为编写代码的次数较少)

3。 controlName.addTarget(...)是处理IBAction链接的编程方式。我的建议是,如果您使用故事板/界面构建器坚持使用IBAction。如果从故事板中删除对象,它会更容易,它会自动取消链接目标/操作。

设置目标实际上是UIControl类的一部分,如果您的对象类型不是基于UIView(或继承UIControl的东西),您显然无法使用addTarget(...)但您的选项是使用自定义委托/协议。

UIControl通常用于在用户更改视图时通知对象。这些事件列在此document

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