前言:因?yàn)镺bject-C是不支持多繼承的,所以很多時(shí)候都是用Protocol(協(xié)議)來(lái)代替痢法。Protocol(協(xié)議)只能定義公用的一套接口狱窘,但不能提供具體的實(shí)現(xiàn)方法。也就是說(shuō)财搁,它只告訴你要做什么蘸炸,但具體怎么做,它不關(guān)心尖奔。
當(dāng)一個(gè)類要使用某一個(gè)Protocol(協(xié)議)時(shí)搭儒,都必須要遵守協(xié)議。比如有些必要實(shí)現(xiàn)的方法提茁,你沒(méi)有去實(shí)現(xiàn)淹禾,那么編譯器就會(huì)報(bào)警告,來(lái)提醒你沒(méi)有遵守××協(xié)議茴扁。注意稀拐,我這里說(shuō)的是警告,而不是錯(cuò)誤丹弱。對(duì)的德撬,就算你不實(shí)現(xiàn)那些“必要實(shí)現(xiàn)”的方法,程序也是能運(yùn)行的躲胳,只不過(guò)多了些警告蜓洪。
Protocol(協(xié)議)的作用:
1. 定義一套公用的接口(Public)
@required:必須實(shí)現(xiàn)的方法
@optional:可選?實(shí)現(xiàn)的方法(可以全部都不實(shí)現(xiàn))
2. 委托代理(Delegate)傳值:
它本身是一個(gè)設(shè)計(jì)模式,它的意思是委托別人去做某事坯苹。
比如:兩個(gè)類之間的傳值隆檀,類A調(diào)用類B的方法,類B在執(zhí)行過(guò)程中遇到問(wèn)題通知類A粹湃,這時(shí)候我們需要用到代理(Delegate)恐仑。
又比如:控制器(Controller)與控制器(Controller)之間的傳值,從C1跳轉(zhuǎn)到C2为鳄,再?gòu)腃2返回到C1時(shí)需要通知C1更新UI或者是做其它的事情裳仆,這時(shí)候我們就用到了代理(Delegate)傳值。
首先創(chuàng)建兩個(gè)ViewController孤钦,一個(gè)是OneViewController歧斟,另一個(gè)是TwoViewController纯丸,從twoVC中把值傳到oneVC
@protocol Mydelegate<NSObject>
-(void)chuazhi:(NSString *)str;
@end
設(shè)置屬性:
@property (weak,nonatomic)id delegate;
在twoVC的點(diǎn)擊事件中:
if ([_delegate respondsToSelector:@selector(sendValue:)]) { // 如果協(xié)議響應(yīng)了sendValue:方法
[_delegate ?chuazhi:_textField.text]; // 通知執(zhí)行協(xié)議方法
以上代理就設(shè)置完成了静袖,在需要此參數(shù)的ViewController中先遵循代理
OneViewController *oneVC = 【OneViewController alloc】init】觉鼻;
oneVC.delegate = self;
代理方法:
-(void)chuazhi:(NSString *)str
{
—textFiled队橙。text = str坠陈;
}
小結(jié):
當(dāng)你需要定義一套公用的接口,實(shí)現(xiàn)方法可以是不同的時(shí)候捐康,你可以使用Protocol協(xié)議畅姊。
當(dāng)你需要進(jìn)行類與類之間的傳值時(shí),你也可以基于Protocol協(xié)議吹由,使用代理設(shè)計(jì)模式進(jìn)行傳值。
從前一頁(yè)傳到后一頁(yè)就不用多說(shuō)了朱嘴,就是屬性傳值倾鲫,相信大家都會(huì)使用的,喜歡的給個(gè)贊萍嬉,謝謝大家
?