NSNotification多次執行的問題

2021-07-15 10:43:41 字數 1665 閱讀 7259

本文主要講述在ios開發過程中, 有關於nsnnotification的使用相關的問題, 問題主要源於我在專案開發中, 監聽鍵盤顯示和關閉的相關通知, 發現通知方法會被多次執行, 因為有很多地方會註冊這兩個通知, 就會發現未顯示的介面, 還是可以執行通知方法, 這樣做明顯是沒有必要的, 接下來就具體解釋怎麼解決這樣的問題?

一種是我們應用自己發出的通知, 這種一般面向整個應用級別。

還有一種就是系統傳送的通知, 像鍵盤顯示和關閉等事件。

一般而言, 我們使用通知來傳送訊息, 只要註冊了相關通知, 而註冊物件沒有被銷毀的, 都是可以接受通知事件的, 一般註冊和銷毀通知, 我們會在init或者viewdidload中註冊通知, 在dealloc中銷毀通知, 這樣就存在乙個問題, 如果是系統發出的通知, 只要註冊了的就會執行, 這就造成了介面沒有顯示, 也可以接受通知事件, 當然這對於我們自己發出的通知是沒有問題的, 因為我們本來就是要達到這個目的, 那麼對於鍵盤事件這種系統通知, 我們應該怎麼去做呢?

一般我們會使用下面的方式註冊通知:

[[nsnotificationcenter defaultcenter]

addobserver

:self

selector:@selector(keyboardwillshow:)

name:uikeyboardwillshownotification

object:nil];

[[nsnotificationcenter defaultcenter]

addobserver

:self

selector:@selector(keyboardwillhide:)

name:uikeyboardwillhidenotification

object:nil];

然後使用下面的方式銷毀:

[[nsnotificationcenter defaultcenter]

removeobserver

:self

name

:uikeyboardwillshownotification

object

:nil];

[[nsnotificationcenter defaultcenter]

removeobserver

:self

name

:uikeyboardwillhidenotification

object

:nil];

當然,這樣寫並沒有什麼問題, 問題在於, 如果我們是在viewdidload或者init方法中註冊的通知, 那麼即使當前viewcontroller不可見, 同樣是可以收到鍵盤通知的, 這樣其實是沒有必要的, 這種情況大家可以自己寫demo檢視一下, 有時候可能會帶來不必要的問題, 其實最好的做法就是, 當前viewcontroller消失後, 就不接受鍵盤事件了, 那麼一種很簡單的做法就是:

其實, 解決的方法比較簡單, 但是這樣的問題有時候很容易被忽略, 我們也應該盡量去避免這樣的問題。

nsnotification is being called multiple times from uitabbarcontroller

NSNotification學習筆記

這是乙個觀察者模式。首先在你需要監聽的類中加入觀察者 void addobserver id observer selector sel aselector name nsstring aname object id anobject 這個觀察者在監聽到anobject傳送名字為aname的noti...

NSNotification 通知傳值

方法如下 在a頁面viewdidload中註冊乙個通知 objc view plain copy 註冊通知,進行傳值 name reloadvoewnotification 這個就是其唯一標示符.系統是用來做鑑別其惟一性,就是裝置標示符一樣 nsnotificationcenterdefaultce...

NSNotification通知的使用

nsnotification通知傳值的使用 1 建立通知 建立在當前需要使用的頁面 nsnotificationcenter defaultcenter addobserver self selector selector notificationmethod name customname obj...