iphone - Action 方法和协议(protocol)方法有什么区别?

标签 iphone objective-c ios cocoa-touch

我开始学习 iOS 编程,遇到了这样的事情:为了处理用户在 UITextField 中输入文本后按下回车时的事件,我的 View Controller 从 UITexTFieldDelegate 协议(protocol)实现“textFieldShouldReturn:textField”。但是,要在“Editing Did End”时处理事件,我需要在 View Controller 中声明一个 IBAction 方法,并将事件连接到它。

这两种类型的事件处理方法有什么区别?

最佳答案

“Editing Did End”是 UIControl 类的一部分,UITextField 继承自 UIControl。此类事件是此类响应的已注册触摸事件之一,进行此注册的方法是将操作(使用 IB 的 IBAction)分配给特定事件。

实现的委托(delegate)协议(protocol)部分归功于 Cocoa 设计模式中委托(delegate)协议(protocol)提供的“扩展机制”。本质上,这个想法是您可以为对象(在本例中为 UITextField)提供特殊行为,而无需子类化。想象一下,例如,您想要在允许“返回”按钮之前进行某种验证。在这种情况下,您将被迫设置一个 UITextField 子类,并在其中硬编码此验证代码。对于每个不同的验证代码,您将被迫实现不同的子类。使用委托(delegate)机制,您可以委托(delegate)其他东西(通常是文本字段所有者 View Controller )来执行此“类扩展”,而无需子类化。因此,您可以按实例进行类自定义。

请注意,这种方法是连贯的:被视为“事件”的所有内容(触摸向上、向下触摸、结束编辑,都与用户与显示器而不是键盘的某些交互相关)使用 UIControl 目标连接到类-作用机制。实例“特定”的所有内容(而不是类!)都使用委托(delegate)进行管理。

关于iphone - Action 方法和协议(protocol)方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8131571/

相关文章:

ios - UITextView的用户控制宽度

iphone - HTML,Javascript和CSS作为应用程序

iphone - 在 iPhone 上构建多 View 应用程序

iphone - 带有 HTTPBody 输入流的 NSURLRequest : Stream sends event before being opened

ios - 如何始终显示 UITextView 的滚动条?

objective-c - 在 UIResponder 链上发送事件?

ios - 构建在设备上运行的自定义框架

ios - 除了 prepareForSegue :? 之外,在哪里设置 transitioningDelegate

ios - Objective-C - 在循环后删除/隐藏 NSProgressIndicator

ios - 使用 Swift 2.0 自定义 CalloutView 最佳方法?