天天看點

OC傳值之-通知,NSNotificationCenter

1.背景:

ios開發的傳值方式大緻分為五種,我們在寫應用的時候免不了用到通知,每一種通知又有各自的特點,我們要根據自己的需要合理選擇運用。本文着重介紹通知。

2.簡介:

本文介紹通知的基本用法,包括建立和發起通知等。

3.原理:

通知的原理其實很簡單,添加通知事件的時候設定一個辨別符和一個通知執行的事件,然後在另一個地方發起通知,利用前面的辨別符作為比對。一般發起通知有條件判斷,判斷成功就發出通知,開始添加的通知事件便被執行。舉個例子,在網絡請求的地方,如果網絡請求成功就發起通知,在Model等地方處理網絡請求的資料。

4.步驟:

1).在一個控制器裡添加通知(監聽)

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(remove) name:@"ArrayOutOfBounds" object:nil];//添加通知事件
/*
self為觀察者,即控制器本身
remove為接收到通知後調用的方法,即觸發時間
ArrayOutOfBounds為通知的辨別符,也就是名字
object裡面填接收哪個發送者的通知,nil表示接受所有發送者的通知
*/
           

2).在需要發出通知的地方添加代碼

[[NSNotificationCenter defaultCenter] postNotificationName:@"ArrayOutOfBounds" object:nil];
/*
ArrayOutOfBounds為通知的名字,必須與前面注冊的通知名字相同
object裡面填附帶的資訊,*不同于注冊*,比如網絡請求成功了,我們可以在這裡吧網絡請求下來的object傳送過去,remove(假如是附帶參數的方法)方法裡面就可以直接接收并且使用。
*/
           

3).移除通知(移除通知是一個良好的編碼習慣,能夠避免一些不必要的麻煩,各位可以自行嘗試不移除是否會crash)

- (void)dealloc{
    //所有本界面執行的通知事件,要在注釋前登出(否則會出現崩潰等很多弊端)
    [[NSNotificationCenter defaultCenter] removeObserver:self];//移除本控制器所有通知事件(一次性移除,下面是單個移除)
   /*[NSNotificationCenter defaultCenter] removeObserver:<#(nonnull id)#> name:<#(nullable NSString *)#> object:<#(nullable id)#>];*/
}

}
           

4).鍵盤通知。到了這裡通知的介紹就結束了,不過有些系統定義的通知我們也要了解,比如鍵盤通知

//鍵盤通知(下面四種,一眼就能看出什麼時候觸發通知)
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(up:) name:UIKeyboardWillShowNotification object:nil];//彈出鍵盤,則觸發up方法
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(down:) name:UIKeyboardWillHideNotification object:nil];
//     UIKeyboardWillShowNotification;
//     UIKeyboardDidShowNotification;
//     UIKeyboardWillHideNotification;
//     UIKeyboardDidHideNotification;
           

顯然鍵盤資訊被傳送給up/down方法了,接着就可以在兩個方法中擷取一些資訊,然後做鍵盤彈出和收回的一些界面高度适應設定

- (void)up:(NSNotification *)info{//info就是鍵盤
    NSDictionary *userInfo = info.userInfo;
    CGRect keyBoardFrame = [userInfo [UIKeyboardFrameBeginUserInfoKey] CGRectValue];//擷取字典中鍵盤的值
    CGFloat height = keyBoardFrame.size.height;//目前鍵盤的高
    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;//螢幕的高
}

- (void)down:(NSNotification *)info{
}