对iOS中Delegate的理解

时间:2022-01-23 08:48:20

首先 协议protocol 和委托delegate 是两个完全不同的概念  放在一起说 是因为我们总是在同一个头文件里看到它们;

首先解释一下什么是委托 :举个例子 ,我工作的时候给你打电话,让你帮我查某人的电话号码,把事情交给你后,我继续工作 过了几分钟 你打电话回来告诉我 查到的结果。。。@end     那么你就是我的委托对象,当你完成事件后 返回给我一个值;这就是委托。也就是   :我.delegete =你 ;

Delegate本身应该称为一种设计模式。

是把一个类自己需要做的一部分事情,让另一个类(也可以就是自己本身)来完成。

比如

声明SelectCityProtocol.h 协议类,设定一个协议方法:delegateMethod 

@protocol SelectCityProtocol <NSObject>

//必须实现的

@required

- (void)selectcity:(NSString *)currentCity;

@end

MovieViewController.h电影类,在MovieViewController.h类中实现该协议并实现方法:

-(void)selectCity{

CitySelectViewController *citySelect=[[CitySelectViewController alloc]init];

citySelect.delegate=self;//回调函数 必须写这委托

[self presentViewController:citySelect animated:YES completion:nil];

}

-(void)selectcity:(NSString *)currentCity{

NSLog:("%@",currentCity);

}

CitySelectViewController.h城市选择类,在CitySelectViewController.h中调用代理方法;

#import "SelectCityProtocol.h"

@property(nonatomic,assign) id<SelectCityProtocol>delegate; //记住一定要assign避免循环引用

//确定选择的城市

-(void)confirmSelectCity:(UIBarButtonItem *)sender

{

[self.delegate selectcity:@"北京"];

[self dismissViewControllerAnimated:YES completion:nil];

}

这就是CitySelectViewController.h城市选择类委托MovieViewController.h电影类实现selectcity:选择城市方法;

其实delegate只是一种模式,大家约定俗成,当把自己内部一部分实现暴露给另外一个类去做的时候,就叫实际做事的类为delegate,当然你也可你把它命名为任何名字;

想想A类里写tableview.delegate=self;  是tableview委托A干某事