通知傳值
界面之間的傳值有很多方法,最基本的是可以實(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ì)象。