您的位置:首页 > 移动开发 > IOS开发

ios中对protocol协议的个人理解(一,对事件的监听)

2014-10-02 23:24 417 查看
做开始自学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;

}

通过以上步骤,我们即模拟完成了事件的监听。(以上代码出自李明杰老师的教程,这里借用了,感谢他,勿喷!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: