以下是我總結(jié)的協(xié)議傳值封裝的方法柴灯。
問(wèn)題:如果A頁(yè)面跳轉(zhuǎn)B,B需要回傳值至A頁(yè)面费尽,怎么回傳赠群?
當(dāng)然,回傳有很多方式旱幼,諸如協(xié)議查描,通知,Block柏卤,AppDelegate等等冬三。但協(xié)議是最安全,也是最符合面向?qū)ο笳Z(yǔ)言風(fēng)格的一種值回傳方式缘缚。
一般協(xié)議回傳的做法是在B類的.h文件中聲明協(xié)議和協(xié)議方法(1)勾笆,然后聲明協(xié)議屬性(2),在B中的.m中調(diào)用協(xié)議方法(3)桥滨。
再回到A類中遵守協(xié)議(4)窝爪,A頁(yè)面跳轉(zhuǎn)B頁(yè)面時(shí),將協(xié)議對(duì)象設(shè)置成自己self(5)齐媒,最后引入?yún)f(xié)議方法(6)達(dá)到回傳的目的酸舍。
是不是很麻煩?確實(shí)太麻煩了里初,6個(gè)步驟啃勉,如果每次回傳值都這么寫(xiě),累覺(jué)不愛(ài)八痢淮阐!
其實(shí)我們可以這么做叮阅,下面看下如何封裝協(xié)議傳值吧!
1.建立SelectProtocal的.h文件(只需要?jiǎng)?chuàng)建Header File)
如下:
#import
@protocolSelectProtocal
@optional
- (void)didSelectedList:(NSMutableArray*)array type:(NSString*)type;//可傳遞一個(gè)數(shù)組
- (void)didSelectedSingle:(id)item type:(NSString*)type;//可傳遞一個(gè)對(duì)象
@end
2.在B類中:
.h中引入?yún)f(xié)議頭文件
#import"SelectProtocal.h"
聲明協(xié)議屬性
@property(nonatomic,weak)__weak id?delegate;
在.m合適的地方傳遞
if(self.delegate&&[self.delegaterespondsToSelector:@selector(didSelectedList:type:)]){
[self.delegate didSelectedList:array?type:@"Btype"];
[self.navigationControllerpopViewControllerAnimated:YES];//跳轉(zhuǎn)回A類
}
注:
self.delegaterespondsToSelector:@selector(didSelectedList:type:):協(xié)議中的方法泣特,如果是要傳遞一個(gè)對(duì)象浩姥,則用另外一個(gè)方法
array:你要傳遞的數(shù)組
Btype:你要傳值的類型,名字隨便取,用于標(biāo)注,在接收值的地方會(huì)用到状您,此參數(shù)非常重要勒叠,必須是唯一的
3.到A類中
遵守協(xié)議:
<SelectProtocal>
設(shè)置代理:
BViewController *ctrl = [BViewController new];//在A類跳轉(zhuǎn)B類處
ctrl.delegate=self;
4.在A類中實(shí)現(xiàn)協(xié)議方法:
- (void)didSelectedList:(NSMutableArray*)array type:(NSString*)type{
if([typeisEqualToString:@"Btype"]) {
? ? ? ? ?注:這里用到了B類中的標(biāo)識(shí)符Btype,這個(gè)標(biāo)識(shí)符必須唯一膏孟,因?yàn)闀?huì)在其他類中復(fù)用到這個(gè)協(xié)議方法眯分,如果標(biāo)識(shí)符沖突就會(huì)有問(wèn)題。
? ? ? ? 在這里我們就能取到從B類中傳遞過(guò)來(lái)的數(shù)組array柒桑,如果是對(duì)象同理調(diào)用另外一個(gè)協(xié)議方法傳遞弊决。
}
這樣如果你明白了,下次就可省去了聲明協(xié)議方法的時(shí)間了魁淳。