[英]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邏輯推入視圖(即將視圖視為控制器),那么這是一個紅旗。
首先,您應該考慮何時停止接收通知:
您應該始終檢查您的視圖是否觀察到通知並調用-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
的實例方法。
作為鍵盤通知的練習,我通常使用
的addObserver
在
viewWillAppear中
和
removeObserver
在
viewWillDisAppear
每次都對我很有用,它確保沒有鍵盤通知傳遞給屏幕上沒有的視圖,這可以防止因錯誤的鍵盤通知而導致應用程序崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.