行动方法和协议方法之间有什么区别?

时间:2011-11-15 04:37:54

标签: iphone objective-c ios cocoa-touch

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

在协议(用@protocol // name \ superclass表示)中,可以指定符合类可以,将要或必须采用@optional或@required方法的方法。有人可能会使用协议来说,将数据从一个视图传递到下一个视图,只要第二个视图符合协议(如@implementation Classname:NSObject)这与IBActions和void函数形成鲜明对比,这些函数是本地的,无法通过其他控制器(类方法除外)。