1、IOS中協議的用途一般是用來進行反向傳值,一般步驟如下:
1)聲明協議
@protocol ThirdDalegate <NSObject>
-(void)printNum:(int)num;//自定義方法用來反向傳值
@end
2)定義協議屬性
@interface SecondViewController :UIViewController
@property(nonatomic,assign)id<SecondDalegate>delegate;//定義屬性delegate
@end
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)協議屬性
@interface TempView : UIView
@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.boundsandDelegate:self];
[self.viewaddSubview:tempV];
}
-(NSInteger)ViewWithNum{
return3;
}
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]);
}
}
returnself;
}
【iOS中協議delegate的傳值注意點】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!