簡體   English   中英

何時取消訂閱UIView中的NSNotification

[英]When to unsubscribe from a NSNotification in a UIView

我在UIView中使用以下NSNotifications,以便在出現UIKeyboard時通知視圖並在屏幕上調整其位置(框架):

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];

上面的兩個通知正在UIView的-init方法中訂閱。 一旦視圖在屏幕外消失,取消訂閱這些通知的最佳位置在哪里? 目前,只要UIKeyboard出現在另一個視圖中,應用程序就會崩潰,大概是因為仍然會向當時發布的UIView發送通知。

此外,除了-init方法之外,還有更好的訂閱通知的地方嗎?

謝謝你的幫助。

-[UIView willMoveToWindow:]即使從窗口中刪除視圖,也會調用-[UIView willMoveToWindow:]-[UIView didMoveToWindow] 在這種情況下,window參數(或-didMoveToWindow情況下的window屬性)將為nil,即:

- (void)willMoveToWindow:(UIWindow *)newWindow {
    if (newWindow == nil) {
        // Will be removed from window, similar to -viewDidUnload.
        // Unsubscribe from any notifications here.
    }
}

- (void)didMoveToWindow {
    if (self.window) {
        // Added to a window, similar to -viewDidLoad.
        // Subscribe to notifications here.
    }
}

除了一些邊緣情況,這是一種安全的方法。 如果需要更多控制,可以觀察視圖所屬窗口的隱藏屬性。

我把我的removeObserver :調用-dealloc

到目前為止沒有任何問題。

確定的答案(例如,確保NSNotificationCenter在其生命周期結束時不再引用某個對象)就像@Tom建議並將其自身作為dealloc的觀察者一樣移除。

主觀答案是,只要通知不再與對象相關,就停止觀察也是一種好習慣。 這完全取決於您根據應用程序的設計來決定。 例如,如果您有視圖保持活動但進出視圖,您可能決定開始觀察它們何時被添加到子視圖並停止觀察它們何時被刪除。

WRT應該駐留在通知邏輯中(在視圖中與控制器中),這也取決於您,顯然它可以雙向工作。 我會根據具體情況做出決定。 如果在視圖中處理通知需要將app邏輯推入視圖(即將視圖視為控制器),那么這是一個紅旗。

首先,您應該考慮何時停止接收通知:

  1. 取消分配視圖時
  2. 當視圖消失時

您應該始終檢查您的視圖是否觀察到通知並調用-removeObserver: in -dealloc 此外,如果您考慮2,則覆蓋-viewWillDisappear-viewDidDisappear或您操作視圖的UIViewController的視圖層次結構的任何其他點。

我建議你把邏輯放到UIViewController中,因為在關系方面,UIView不擁有它的框架。

您可以創建一個單獨的函數來添加和刪除觀察,然后您可以從視圖的實例中獲取所有這些函數。 順便提一下你的問題的答案,我會刪除觀察者,然后從superview中刪除視圖本身。 我希望你明白。

要取消訂閱,您可以使用

- (void)removeObserver:(id)notificationObserver

要么

- (void)removeObserver:(id)notificationObserver name:(NSString *)notificationName object:(id)notificationSender

這兩種方法都是NSNotificationCenter的實例方法。

看一下NSNotificationCenter類參考

作為鍵盤通知的練習,我通常使用

的addObserver

viewWillAppear中

removeObserver

viewWillDisAppear

每次都對我很有用,它確保沒有鍵盤通知傳遞給屏幕上沒有的視圖,這可以防止因錯誤的鍵盤通知而導致應用程序崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM