iOS開(kāi)發(fā)中我們經(jīng)常用到的傳值方法無(wú)非4種:
1.我們需要將上個(gè)頁(yè)面的值通過(guò)跳轉(zhuǎn)傳到下一個(gè)頁(yè)面中,也就是正向傳值,這是最簡(jiǎn)單的。
我們第一個(gè)頁(yè)面為OneViewController,跳轉(zhuǎn)的第二個(gè)頁(yè)面為T(mén)woViewController,只需在跳轉(zhuǎn)的時(shí)候?qū)woViewController創(chuàng)建實(shí)例化妇菱,并給需要接收的屬性賦值即可。
?TwoViewController * TwoVC=[[TwoViewController alloc]init];
? ? TwoVC.itmestr=@"456";
? ? [self.navigationController pushViewController:TwoVC animated:YES];
當(dāng)然還需要在TwoViewController.h文件中聲明可供外部訪問(wèn)接收值的屬性
@property(nonatomic ,copy)NSString * itmestr;
2.在我們開(kāi)發(fā)中還需要用到的常用的反向傳值的方法還有代理delegate(方法一)
我們需要將A類(lèi)中的值傳到B類(lèi)中(就是當(dāng)前處于B類(lèi)中暴区,操作B類(lèi)中創(chuàng)建的A類(lèi)并將A類(lèi)的數(shù)據(jù)返向傳值給了B類(lèi))
@protocol A類(lèi)Delegate<NSObject>
- (void)A類(lèi)Delegate方法名:(NSMutableArray*)SenderArray;//傳遞值獲取的方法也是B類(lèi)需要實(shí)現(xiàn)的方法
@end
@property(nonatomic,assign)id<A類(lèi)Delegate>delegate;//聲明delegate屬性
在需要反向傳值的地方判斷B類(lèi)是否遵循了代理并進(jìn)行傳值
? if([self.delegaterespondsToSelector:@selector(A類(lèi)Delegate方法名:)]) {
? ? ? ? [self.delegate A類(lèi)Delegate方法名:self.selectArray];
? ? }
B類(lèi):
首先B類(lèi)遵循A類(lèi)的Delegate闯团,既:
@interface B類(lèi)ViewController ()<A類(lèi)Delegate>
@optional
@end
然后實(shí)例話(huà)A類(lèi)
A類(lèi) * A=[A類(lèi) alloc]init];
A.delegate=self;
實(shí)現(xiàn)代理方法:
- (void)A類(lèi)Delegate方法名:(NSMutableArray*)SenderArray{
此時(shí)的SenderArray就是從A類(lèi)中傳過(guò)來(lái)的數(shù)據(jù);
}
2.在我們開(kāi)發(fā)中還需要用到的常用的反向傳值的方法還有Block(方法二)
首先我們需要在需要往外傳值的類(lèi)中先聲明一個(gè)block:
typedef void(^block名稱(chēng)Block) (參數(shù)類(lèi)型“就是傳入的屬性類(lèi)型” *參數(shù)名“傳入的值的名稱(chēng)”);
然后再聲明一個(gè)block的屬性:
@property(nonatomic,copy)block名稱(chēng)Block? 屬性名稱(chēng)Block;
然后再需要傳值的時(shí)候?qū)懭胫担?/p>
? __weak typeof(self) weakself = self;
? ? ? ? ? ? ? ? ? ? ? ? if(weakself.屬性名稱(chēng)Block) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? //將自己的值傳出去颜启,完成傳值
? ? ? ? ? ? ? ? ? ? ? ? ? ? weakself.屬性名稱(chēng)Block(需要穿的值);
? ? ? ?}
最后我們只需將要接收值的時(shí)候把被傳值的類(lèi)聲明的屬性調(diào)用該block的屬性即可
? ?被傳值的類(lèi)VC.屬性名稱(chēng)Block= ^(NSString *?參數(shù)名“傳入的值的名稱(chēng)”){
? ? ? ? ? ?_UserNickname=參數(shù)名“傳入的值的名稱(chēng)”偷俭;
? ? ? ? };
3.我們?cè)陂_(kāi)發(fā)中再不受任何限制的情況下還有一種傳值方法就是通知NSNotificationCenter(方法三)
首先在接收傳遞值類(lèi)中注冊(cè)一個(gè)通知
?[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(通知的方法:) name:@"通知名" object:nil];
實(shí)現(xiàn)通知的方法并接收傳遞的值
-(void)通知的方法:(NSNotification*)sender{
}
在通知不需要的時(shí)候記住要移除通知
- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(nullableNSNotificationName)aName object:(nullableid)anObject;
在需要去更改的類(lèi)中發(fā)送通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"通知的名稱(chēng)" object:傳遞的參數(shù)];
歡迎指正!g终怠涌萤!