0

在我的課XI發佈這樣的通知:只有NSNotification的NSLog工作

[[NSNotificationCenter defaultCenter] addObserver:viewController 
              selector:@selector(doThis:) 
               name:@"myNotification" 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" object:nil]; 

在我的課易接受她這樣的:

- (void) doThis: (NSNotification *) notification { 
NSLog(@"It works."); 
[uiTextView resignFirstResponder]; } 

控制檯顯示的NSLog消息,但我的UITextView確實不隱藏它的鍵盤。 (例如,viewDidLoad中的resignFirstResponder/becomeFirstResponder的作品。)

有什麼特別的事情我需要做嗎?

回答

2

正如康拉德說,觀察員應添加和刪除自己...

使用最佳實踐來定義通知的名稱爲靜態常量喜歡如下:

static NSString *const kMyNotification = @"myNotification"; 

爲什麼?因爲存在這樣的風險:「myNotification」可能是兩個不同的對象,然後notificationName是不同的,您將不會收到通知。由於我總是將它們聲明爲靜態常量,所以我從來沒有遇到NSNotifications的問題。

然後使用它是這樣的:

要註冊觀察者

[[NSNotificationCenter defaultCenter] addObserver: self 
             selector: @selector(doThis:) 
              name: kMyNotification 
              object: nil]; 

要發佈的通知

[[NSNotificationCenter defaultCenter] postNotificationName: kMyNotification 
                object: nil]; 

要刪除的觀察者:

[[NSNotificationCenter defaultCenter] removeObserver: self]; 
+0

優秀的評論! – 2012-01-30 23:47:51

+0

哇,謝謝!這對我有很大的幫助。 – derFalke 2012-01-30 23:57:49

3

FWIW,在絕大多數情況下,觀察者應該被觀察者本身添加和移除,而不是由單獨的對象。 (如果觀察者在單獨的對象之前消失,並且沒有正確地移除觀察者,或者反之亦然,會發生什麼情況?這使得泄漏觀察者或在通知上釋放對象時崩潰都很容易)。無論如何,第一件事是第一件事:你是否證實uiTextView不是零,並指向第一響應者?我相當懷疑uiTextView不是你認爲的那樣。

+0

好吧, THA NKS。這是零,但我仍然可以輸入它,這有點令人困惑。現在我找到了解決方案。 – derFalke 2012-01-30 23:35:38