一般正向傳值基本使用屬性傳值缠捌,這里不多講。如果需要逆向傳值,基本使用代理和block曼月,也可以使用通知谊却。這些基本都會(huì)使用,但是平時(shí)寫的少哑芹,所以做一個(gè)總結(jié)炎辨。
1.代理傳值
委托方:
<1>.委托方.h文件interface之上寫協(xié)議
@protocol SendValueDelegate <NSObject>
- (void)sendValue:(NSString*)value;
@end
@interface SecondViewController : UIViewController
<2>.實(shí)例化協(xié)議變量
@property(nonatomic,assign)id<SendValueDelegate>delegate;
<3>.協(xié)議變量響應(yīng)協(xié)議方法(傳值)
//一般寫在返回方法或viewWillDisappear中
if ([_delegate respondsToSelector:@selector(sendValue:)]) {
[_delegate sendValue:text.text];
}
代理方:
<1>.遵循代理協(xié)議
@interface FirstViewController ()<SendValueDelegate>
<2>.設(shè)置代理
SecondViewController * Second = [[SecondViewController alloc]init];
Second.delegate = self;
<3>.實(shí)現(xiàn)協(xié)議方法
- (void)sendValue:(NSString *)value{
label.text = value;
}
做好以上六步,逆向傳值不是問(wèn)題
2.block傳值
在進(jìn)行block傳值時(shí)聪姿,因?yàn)閎lock寫法比較怪異碴萧,所以先對(duì)block做一個(gè)簡(jiǎn)單地復(fù)習(xí)。
先來(lái)一個(gè)簡(jiǎn)單的block:
BOOL (^getValue)(int) = ^(int input) {
if (input % 2 == 0) {
return YES;
} else {
return NO;
}};
//調(diào)用
getValue(3);
block以后會(huì)做深入的分析末购,接下來(lái)主要是傳值部分
第一個(gè)頁(yè)面
<1>.先用typedef對(duì)block做一個(gè)簡(jiǎn)單的包裝
逆向傳值時(shí)破喻,寫在第二個(gè)頁(yè)面頭文件的interface之上
typedef void (^sendValueBlock)(NSString * firstValue);
<2>實(shí)例化這個(gè)block
@property(nonatomic,copy)sendValueBlock valueBlock;
<3>相關(guān)方法內(nèi)對(duì)block賦值
- (void)viewWillDisappear:(BOOL)animated{
if(!self.valueBlock){
self.valueBlock(text.text);
}
}
第二個(gè)頁(yè)面
<1>在點(diǎn)擊進(jìn)入下一個(gè)頁(yè)面的方法中進(jìn)行傳值
SecondViewController * Second = [[SecondViewController alloc]init];
Second.valueBlock = ^(NSString * first){
lab.text = first;
};
兩種方式傳值,block更簡(jiǎn)易寫盟榴,缺點(diǎn)是不大容易書寫曹质,習(xí)慣就好...
3.現(xiàn)在簡(jiǎn)單談些notification傳值
<1>發(fā)送通知,把值寫到字典中并賦給userInfo
NSDictionary * dict = [NSDictionary dictionaryWithObject:web forKey:@"website"];
NSNotification * notice = [NSNotification notificationWithName:@"reloadWebview" object:nil userInfo:dict];
[[NSNotificationCenter defaultCenter]postNotification:notice];
<2>接受通知
NSNotificationCenter * reloadCenter = [NSNotificationCenter defaultCenter];
[reloadCenter addObserver:self selector:@selector(reloadWebsite:) name:@"reloadWebview" object:nil];
<3>實(shí)現(xiàn)方法
- (void)reloadWebsite:(NSNotification *)notice{
NSString * website = [notice.userInfo objectForKey:@"website"];
}
通知可能更容易理解和書寫,但是有時(shí)通知太多不太容易跟蹤擎场,三者各有各自的好處和適用場(chǎng)景咆繁,在此僅以簡(jiǎn)單記述。