iOS

OC 委托模式

2017-03-28  本文已影响38人  subject_2619

委托模式是我们经常用到的设计模式,首先OC里面不支持多继承,那么我们想实现类似多继承的功能的时候,我们可能会想到委托模式。顾名思义,代理模式我们可以简单的认为:A类里面触发了某一事件,需要告诉B类,B类要进行相应的操作。

实现代理的步骤:

1.首先要实现代理的定义,用关键字@protocol,名称一般是”类名+Delegate“,用@optional

表示可以实现也可以不实现的方法,@required是必须实现的方法,像tableView里面  返回行数与行里面内容。

2.在数据来源的类中,定义属性,一般情况下,我们用weak修饰,防止循环引用,引起内存泄漏等问题。@property(nonatomic,weak)id delegte;

3.判断代理方是不是实现了代理的方法

```

if([self.delegterespondsToSelector:@selector(test:)]) {

[self.delegtetest:@"代理成功了!"];

}

```

下面Demo如下,ViewController页面中点击按钮,转入TestDemo类中,点击TestDemo中的按钮,能够让ViewController页面打印输出“代理成功了!”。

```

#import

//定义委托

@protocolTestDemoDelegate

//可以实现的方法

@optional

-(void)test:(NSString*)cont;

@end

@interfaceTestDemo :UIViewController

//定义delegate

@property(nonatomic,weak)id delegte;

@property(nonatomic,strong)UIButton*but;

@end

#import"TestDemo.h"

@implementationTestDemo

@synthesizebut;

- (void)viewDidLoad {

self.but=[[UIButtonalloc]initWithFrame:CGRectMake(50,80,60,60)];

but.backgroundColor=[UIColorredColor];

[self.butaddTarget:selfaction:@selector(clickEvent)forControlEvents:UIControlEventTouchDown];

[self.viewaddSubview:but];

}

-(void) clickEvent{

//判断代理方实现该方法

if([self.delegterespondsToSelector:@selector(test:)]) {

[self.delegtetest:@"代理成功了!"];

}

}

@end

- (void)viewDidLoad {

self.but=[[UIButtonalloc]initWithFrame:CGRectMake(50,80,60,60)];

but.backgroundColor=[UIColorredColor];

[self.butaddTarget:selfaction:@selector(clickEvent)forControlEvents:UIControlEventTouchDown];

[self.viewaddSubview:but];

}

-(void) clickEvent{

TestDemo*testDemo=[[TestDemoalloc]init];

testDemo.delegte=self;

[selfpresentViewController:testDemoanimated:truecompletion:nil];

}

//代理Test函数

-(void)test:(NSString*)cont{

NSLog(@"cont=%@",cont);

}

```

上一篇 下一篇

猜你喜欢

热点阅读