iOS開發(fā)-通知的基本使用

通知傳值

界面之間的傳值有很多方法,最基本的是可以實(shí)例化對(duì)象進(jìn)行傳值,也可以使用block塊或者是使用通知進(jìn)行傳值。它們也各有優(yōu)缺點(diǎn),第一種最簡(jiǎn)單,但是在使用ARC環(huán)境的情況下這種方式還是不推薦的,因?yàn)槟憧赡軙?huì)因?yàn)橐粋€(gè)值搞死也傳不過(guò)去,究竟什么原因那。這是因?yàn)樵贏RC環(huán)境下,你傳的值被提前釋放了,這個(gè)問題想必做過(guò)開發(fā)的程序猿都是會(huì)遇到的。費(fèi)勁腦汁了吧,這里說(shuō)一下iOS中使用通知進(jìn)行傳值的方法:

首先使用通知你需要在接收方添加一個(gè)通知即注冊(cè)通知監(jiān)聽器,通知中心(NSNotificationCenter)提供了方法來(lái)注冊(cè)一個(gè)監(jiān)聽通知的監(jiān)聽器(Observer)

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

//observer:監(jiān)聽器,即誰(shuí)要接收這個(gè)通知

//aSelector:收到通知后,回調(diào)監(jiān)聽器的這個(gè)方法,并且把通知對(duì)象當(dāng)做參數(shù)傳入

//aName:通知的名稱。如果為nil,那么無(wú)論通知的名稱是什么,監(jiān)聽器都能收到這個(gè)通知

//anObject:通知發(fā)布者。如果為anObject和aName都為nil,監(jiān)聽器都收到所有的通知

- (id)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block;

//name:通知的名稱

//obj:通知發(fā)布者

//block:收到對(duì)應(yīng)的通知時(shí),會(huì)回調(diào)這個(gè)

//blockqueue:決定了block在哪個(gè)操作隊(duì)列中執(zhí)行,如果傳nil,默認(rèn)在當(dāng)前操作隊(duì)列中同步執(zhí)行

通知

一個(gè)完整的通知一般包含3個(gè)屬性:

- (NSString *)name; //通知的名稱

- (id)object; //通知發(fā)布者(是誰(shuí)要發(fā)布通知)

- (NSDictionary *)userInfo; //一些額外的信息(通知發(fā)布者傳遞給通知接收者的信息內(nèi)容)

初始化一個(gè)通知(NSNotification)對(duì)象:

- (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo

+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;

+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

發(fā)布通知:發(fā)布一個(gè)通知可以在notification對(duì)象中設(shè)置通知的名稱、通知的發(fā)布者和額外信息等;

- (void)postNotification:(NSNotification *)notification;

- (void)postNotificationName:(NSString *)aName object:(id)anObject;

- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

移除通知:

- (void)removeObserver:(id)observer;

- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;

示例:在兩個(gè)類之間傳值

在接受類中注冊(cè)通知監(jiān)聽器

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onChangeImage:) name:@"changeImage" object:nil];

實(shí)現(xiàn)監(jiān)聽回來(lái)的方法:

- (void)onChangeImage:(NSNotification*)sender

{

self.resultOKNumbers = sender.object;

self.dic = sender.userInfo;

UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:nil message:@"確定提交本次繪畫嗎?" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];

alertView.tag = 100002;

alertView.delegate = self;

[alertView show];

}

上級(jí)界面發(fā)送通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"changeImage" object:text];

或者是傳多個(gè)參數(shù):

[[NSNotificationCenter defaultCenter] postNotificationName:@"notificationName" object:text userInfo:dic];

當(dāng)通知發(fā)出后就會(huì)執(zhí)行監(jiān)聽的方法,在方法中通過(guò)sender.object獲得傳過(guò)來(lái)的對(duì)象,當(dāng)需要傳多個(gè)值的時(shí)候可以只用數(shù)組或者是字典作為傳過(guò)來(lái)的對(duì)象。

最后編輯于
?著作權(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)容