1、iOS中协议的用途一般是用来进行反向传值,一般步骤如下:
1)声明协议
@protocol ThirdDalegate <NSObject>
-(void)printNum:(int)num;//自定义方法用来反向传值
@end
2)定义协议属性
@property(nonatomic,assign)id<SecondDalegate>delegate;//定义属性delegate
3)实现协议方法//一般先判断协议方法是否已响应(即是否有其他类遵从本类的协议)
if ([self.delegaterespondsToSelector:@selector(printNum:)]) {
[self.delegateprintNum:1];//进行传值
}
4)代理类接收值(传值的类可以理解成委托类)
@interface ViewController ()<SecondDalegate>
- (void)viewDidLoad {
SecondViewController * second=[[SecondViewControlleralloc]init];
second.delegate=self;
}
-(void)printNum:(int)num{
NSLog(@"%d",num);
}
ps:以上为正常情况下的协议反向传值,是最协议最常见的用法
2、但是有时候我们会想要自定义控件,类似UITableView,那么此时单纯的反向传值已经满足不了该需求,因为我们需要在初始化该控件的时候利用协议传值到该控件内部,类似UITableView的numberOfRowsInSection设置cell数量的这种方法。
1)在委托类中声明协议
@protocol ThirdDelegate <NSObject>
-(NSInteger)ViewWithNum;
@end
2)协议属性
@property(nonatomic,assign)id<ThirdDelegate>delegate;
-(instancetype)initWithFrame:(CGRect)frame andDelegate:(id)delegate;
//一般在控件初始化的时候就传入代理类,以协议方法由于顺序原因不响应
@end
3)在代理类中实现传值
@interface ViewController ()<ThirdDelegate>
- (void)viewDidLoad {
TempView * tempV=[[TempViewalloc]initWithFrame:self.view.bounds andDelegate:self];
[self.viewaddSubview:tempV];
}
-(NSInteger)ViewWithNum{
return 3;
}
4)自定义控件实现初始化方法
-(instancetype)initWithFrame:(CGRect)frame andDelegate:(id)delegate{
self=[superinitWithFrame:frame];
if (self) {
self.backgroundColor=[UIColorredColor];
self.delegate=delegate;//注意点:必须先遵从协议才能响应方法
if ([self.delegaterespondsToSelector:@selector(ViewWithNum)]) {
NSLog(@"%ld",(long)[self.delegateViewWithNum]);
}
}
return self;
}