做开始自学ios也有几个月了,虽然一直是自己一个人在摸索着边学边做,但还好公司项目快完成2/3。趁着国庆再回顾了一下oc语言的一些重点,今天就首先记录一下对delegate的理解!
protocol——委托是协议的一种,顾名思义,就是委托他人帮自己去做什么事。也就是当自己做什么事情不方便的时候,就可以建立一个委托,这样就可以委托他人帮自己去实现什么方法。我个人的理解是委托主要用于两种方式:一是传值,二是监听事件。今天就先说监听事件吧。
通常我们要使用委托机制,一般需要通过以下这五个步骤:
1.创建一个delegate;
2.委托者声明一个delegate;
3.委托者调用delegate里的方法;
4.被委托者实现delegate里的方法;
5. 被委托者设置delegate,以便被委托者使用;
下面是一个通过protocol模拟UIButton的demo:
1.首先创建一个delegate 。我们可以在某一个类的.h文件中创建,也可以单独建立一个文件来创建protocol,这里使用前者,如下为Button.h文件:
#import <Foundation/Foundation.h>
@class Button;
// 创建一个ButtonDelegate ,一般delegate都要实现协议NSObject
@protocol ButtonDelegate <NSObject>
- (void)onClick:(Button *)btn;
@end
@interface Button : NSObject
// 委托者声明了一个delegate,delegate就是按钮的监听器
@property (nonatomic, retain) id<ButtonDelegate> delegate;
// 点击按钮
- (void)click;
@end
2.委托者声明一个delegate,我们这里的委托者为Button这个类所产生的对象。这一步我已经在Button.h文件中实现,即其中的红色字体部分。
3.委托者调用delegate里的方法,如下的Button.m文件中 的click方法的实现:
#import "Button.h"
@implementation Button
- (void)dealloc {
[_delegate release];
[super dealloc];
}
- (void)click {
// 如果_delegate实现了onClick:这个方法
if ( [_delegate respondsToSelector:@selector(onClick:)] ) {
// 按钮被点击了,就应该通知监听器.并且告诉监听器哪个按钮被点击了
[_delegate onClick:self];//这里即是实现了委托者调用delegate里的方法
} else {
NSLog(@"监听器并没有实现onClick:方法");
}
}
@end
4.这里通过创建一个ButtonListener类来作为被委托者,并且完成被委托者实现delegate里的方法这一步,在ButtonListener.m文件中实现:
ButtonListener.h文件为:
#import <Foundation/Foundation.h>
// 对协议进行提前声明,跟@class的用途是一致的
@protocol ButtonDelegate;
@interface ButtonListener : NSObject <ButtonDelegate>
@end
ButtonListener.m文件为:
#import "ButtonListener.h"
#import "Button.h"
@implementation ButtonListener
- (void)onClick {//实现delegate里的方法
NSLog(@"ButtonListener已经监听到按钮被点击了");
}
@end
5.被委托者设置代理delegate,以便被 (注意与前一个被委托者不同)委托者调用。这一步在main.m中实现,main.m文件为:
#import <Foundation/Foundation.h>
#import "Button.h"
#import "ButtonListener.h"
#import "MyListener.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// 初始化一个按钮
Button *button = [[[Button alloc] init] autorelease];
// 初始化一个按钮的监听器
ButtonListener *listener = [[[ButtonListener alloc] init] autorelease];
// 设置按钮的监听器,亦即被委托者设置delegate,以便被委托者使用
button.delegate = listener;
NSLog(@"button:%@", button);
// 点击按钮
[button click];
}
return 0;
}
通过以上步骤,我们即模拟完成了事件的监听。(以上代码出自李明杰老师的教程,这里借用了,感谢他,勿喷!)