iOS 傳值的方式的區(qū)別

1.屬性傳值。

2.block傳值。

3.代理傳值(delegate)

4.通知傳值(notification)。

5.單例傳值。

屬性傳值:

場(chǎng)景:A頁面跳轉(zhuǎn)到B頁面。正向傳值

關(guān)系:一對(duì)一;

·兩個(gè)頁面定義的屬性類型是要一致的。

代碼:

UIViewController *B = [UIViewController new];

B.title = @"B的標(biāo)題";

[A.navigationController pushViewController:B animated:YES];

block傳值:


關(guān)系:一對(duì)一;

使用場(chǎng)景:

常用于回調(diào),簡(jiǎn)單的說就是B有一個(gè)按鈕,當(dāng)按鈕被點(diǎn)擊時(shí)把點(diǎn)擊事件傳傳給A,并傳一個(gè)字符串"B被點(diǎn)了"。


代碼:

//首先在B控制器中聲明一個(gè)block,參數(shù)是一個(gè)字符串

@property (nonatomic,copy) void(^block)(NSString *title);

//同樣在B控制器,在按鈕點(diǎn)擊觸發(fā)的方法里執(zhí)行block

- (void)buttonClick:(UIButton *)sender

{

self.block(@"B被點(diǎn)了");

}

//現(xiàn)在回到A控制器,在推出B的時(shí)候給B的block賦值,簡(jiǎn)單的說,就是在收到B的消息時(shí),想要做什么事

BController *B = [BController new];

B.block = ^(NSString *title) {

//do someThing

A.title = title;

};

[A.navigationController pushViewController:B animated:YES];

同樣的Block在這里作為屬性存在,同屬性傳值一樣,需要兩個(gè)控制器間具有一定關(guān)聯(lián)性。不能跨頁面?zhèn)髦怠?br>

如果一定要跨,就要像接力賽一樣,A傳給B,B傳給C這樣

代理傳值:

場(chǎng)景:A頁面跳轉(zhuǎn)到B頁面,B頁面再返回A頁面。逆向傳值

關(guān)系:一對(duì)一;

代碼:

//首先,在B里定義個(gè)協(xié)議并聲明一個(gè)代理

@protocol B_ButtonClickDelegate

- (void)B_ButtonIsClicked:(NSString *)message;

@end

@interface BController : UIViewController

@property (nonatomic,assign) iddelegate;

@end

//B控制器,點(diǎn)擊事件發(fā)生時(shí)讓代理去執(zhí)行代理方法

- (void)buttonClick:(UIButton *)sender

{? ? [self.delegate B_ButtonIsClicked:@"B的按鈕被點(diǎn)了誰來管管"];}

//推出B之前,讓A成為B的代理

BController *B = [BController new];

B.delegate = A;

[A.navigationController pushViewController:B animated:YES];

//最后A遵守協(xié)議并實(shí)現(xiàn)對(duì)應(yīng)代理方法

@interface AController ()

- (void)B_ButtonIsClicked:(NSString *)message

{

self.title = message;

}

區(qū)別:

代理傳值和block傳值相似,都是將事件分發(fā)出去。但是與block的不同在于,代理具有松耦合性,誰想處理事件成為代理即可。

通知中心傳值:

關(guān)系:一對(duì)多;

代碼:

//在需要處理事件的控制器的初始化方法里訂閱通知,注意,一定是先訂閱

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealAction:) name:@"B的按鈕被點(diǎn)了大家響應(yīng)下" object:nil];

//收到通知后執(zhí)行什么事?實(shí)現(xiàn)**dealAction:**即可

- (void)dealAction:(NSNotification *)sender

{

//這里的object就是發(fā)出通知時(shí)附帶

NSLog(@"%@",sender.object);

//打印結(jié)果--"哈薩克"

}

//在B控制器需要處理事件的時(shí)候發(fā)出通知

- (void)buttonClick:(UIButton *)sender

{

[[NSNotificationCenter defaultCenter] postNotificationName:@"B的按鈕被點(diǎn)了大家響應(yīng)下" object:@[@"哈薩克"]];

}

單例傳值:

iOS系統(tǒng)中常間的單例模式莫過于UIApplication、 NSNotificationCenter、 NSUserDefaults

如何創(chuàng)建單例這里不做說明,以NSUserDefaults為例說下具體使用

代碼:

//以鍵值對(duì)的形式存值到NSUserDefaults

[[NSUserDefaults standardUserDefaults] setObject:@"哈薩克" forKey:@"亞索"];

//從NSUserDefaults取出

NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:@"亞索"];

NSLog(@"%@",value); //打印結(jié)果--"哈薩克"

區(qū)別:

代理是一種回調(diào)機(jī)制,且是一對(duì)一的關(guān)系,通知是一對(duì)多的關(guān)系,一個(gè)對(duì)向所有的觀察者提供變更通知;

效率:Delegate比NSNOtification高;

Delegate和Block一般是一對(duì)一的通信;

Delegate需要定義協(xié)議方法,代理對(duì)象實(shí)現(xiàn)協(xié)議方法,并且需要建立代理關(guān)系才可以實(shí)現(xiàn)通信;

Block:Block更加簡(jiǎn)潔,不需要定義繁瑣的協(xié)議方法,但通信事件比較多的話,建議使用Delegate;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容