委托模式是我们经常用到的设计模式,首先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);
}
```
网友评论