刚开始使用Xcode学习Swift(经过多年的.NET开发),并且经历了一些视频,并注意到人们与UI控件(例如UITextField)交互的方式各不相同。 我看到的三种方式是:
有人可以解释每种方法的利弊,是否认为一种方法比其他方法更好(在哪种情况下适用)?
非常感谢任何见解!
答案 0 :(得分:4)
故事板或xib中的“连接”IBAction
相当于以编程方式添加目标,实际上只是一个偏好问题。如果您要使用故事板或xib,通常的做法是将控件连接起来,以便更容易找到。此外,您需要将IBOutlet
连接到您希望能够在代码中访问的控件。
委托方法实际上与您提到的其他两个选项完全不同。例如,UITextFiled
将具有一些可以直接连接的属性和操作,但是为了利用大部分功能(例如响应),您需要实现多种委托方法。用户键入的每个字符。
以下是一些说明wiring up和delegate 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实际上只能告诉您文本字段是否已更改。