1.屬性傳值。
2.block傳值。
3.代理傳值(delegate)
4.通知傳值(notification)。
5.單例傳值。
屬性傳值:
場景:A頁面跳轉(zhuǎn)到B頁面。正向傳值
關(guān)系:一對一;
·兩個頁面定義的屬性類型是要一致的。
代碼:
UIViewController *B = [UIViewController new];
B.title = @"B的標(biāo)題";
[A.navigationController pushViewController:B animated:YES];
block傳值:
關(guān)系:一對一;
使用場景:
常用于回調(diào),簡單的說就是B有一個按鈕,當(dāng)按鈕被點擊時把點擊事件傳傳給A,并傳一個字符串"B被點了"。
代碼:
//首先在B控制器中聲明一個block,參數(shù)是一個字符串
@property (nonatomic,copy) void(^block)(NSString *title);
//同樣在B控制器,在按鈕點擊觸發(fā)的方法里執(zhí)行block
- (void)buttonClick:(UIButton *)sender
{
self.block(@"B被點了");
}
//現(xiàn)在回到A控制器,在推出B的時候給B的block賦值,簡單的說,就是在收到B的消息時,想要做什么事
BController *B = [BController new];
B.block = ^(NSString *title) {
//do someThing
A.title = title;
};
[A.navigationController pushViewController:B animated:YES];
同樣的Block在這里作為屬性存在,同屬性傳值一樣,需要兩個控制器間具有一定關(guān)聯(lián)性。不能跨頁面?zhèn)髦怠?br>
如果一定要跨,就要像接力賽一樣,A傳給B,B傳給C這樣
代理傳值:
場景:A頁面跳轉(zhuǎn)到B頁面,B頁面再返回A頁面。逆向傳值
關(guān)系:一對一;
代碼:
//首先,在B里定義個協(xié)議并聲明一個代理
@protocol B_ButtonClickDelegate
- (void)B_ButtonIsClicked:(NSString *)message;
@end
@interface BController : UIViewController
@property (nonatomic,assign) iddelegate;
@end
//B控制器,點擊事件發(fā)生時讓代理去執(zhí)行代理方法
- (void)buttonClick:(UIButton *)sender
{? ? [self.delegate B_ButtonIsClicked:@"B的按鈕被點了誰來管管"];}
//推出B之前,讓A成為B的代理
BController *B = [BController new];
B.delegate = A;
[A.navigationController pushViewController:B animated:YES];
//最后A遵守協(xié)議并實現(xiàn)對應(yīng)代理方法
@interface AController ()
- (void)B_ButtonIsClicked:(NSString *)message
{
self.title = message;
}
區(qū)別:
代理傳值和block傳值相似,都是將事件分發(fā)出去。但是與block的不同在于,代理具有松耦合性,誰想處理事件成為代理即可。
通知中心傳值:
關(guān)系:一對多;
代碼:
//在需要處理事件的控制器的初始化方法里訂閱通知,注意,一定是先訂閱
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealAction:) name:@"B的按鈕被點了大家響應(yīng)下" object:nil];
//收到通知后執(zhí)行什么事?實現(xiàn)**dealAction:**即可
- (void)dealAction:(NSNotification *)sender
{
//這里的object就是發(fā)出通知時附帶
NSLog(@"%@",sender.object);
//打印結(jié)果--"哈薩克"
}
//在B控制器需要處理事件的時候發(fā)出通知
- (void)buttonClick:(UIButton *)sender
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"B的按鈕被點了大家響應(yīng)下" object:@[@"哈薩克"]];
}
單例傳值:
iOS系統(tǒng)中常間的單例模式莫過于UIApplication、 NSNotificationCenter、 NSUserDefaults
如何創(chuàng)建單例這里不做說明,以NSUserDefaults為例說下具體使用
代碼:
//以鍵值對的形式存值到NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:@"哈薩克" forKey:@"亞索"];
//從NSUserDefaults取出
NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:@"亞索"];
NSLog(@"%@",value); //打印結(jié)果--"哈薩克"