2014-06-16 31 views
0

我注意到一個非常奇怪的行爲UITextViewUITextViewTextDidChangeNotification調用了兩次

當我註冊UITextViewTextDidChangeNotification時,對於每次擊鍵都會調用兩次回調。

委託回調textViewDidChange:(UITextView *)textView只能正確調用一次。

有沒有人注意到同樣的事情?我真的只是在回調中添加觀察者到默認UITextViewYES,我正在檢查發送通知的UITextView是否是我創建的(我的測試項目中只有1個)。

對於那些你們誰真的需要一些代碼如下:

UITextView *textView = [[UITextView alloc] initWithFrame:textViewFrame]; 
[self.view addSubview:textView]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(textDidChange:) 
              name:UITextViewTextDidChangeNotification 
              object:nil]; 

完蛋了。

textDidChange:在每次擊鍵時調用兩次。

BIG編輯

我很爲混亂很對不起你。我應該清除我將UITextView本身添加爲觀察者。

示例代碼也是錯的,對不起。

正確的示例代碼將是:

- (instancetype)init 
{ 
    self = [super init]; 
    if (self) { 
     [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(textDidChange:) 
              name:UITextViewTextDidChangeNotification 
              object:nil]; 
    } 
} 

任何猜測爲什麼它被稱爲兩次,如果我加入的TextView自己作爲此通知的觀察者?

+0

你可以添加一些代碼嗎? – lucianomarisi

+0

好吧,這真的是最簡單的使用textView。但肯定的是,我添加了一些「示例代碼」 – Cabus

+0

使用您最簡單的代碼,我只收到一個通知,所以我想必須有其他事情發生。 – lucianomarisi

回答

0

大多數情況下,關於你的代碼,如果它在viewDidAppear或viewDidLoad中,並且你釋放了這個UIViewController,但是「不」註銷了觀察者,它將會被激活,並且它會成爲一個潛在的原因被稱爲2次。看一看,並確保你正確地移除觀察者。 它也可能發生,你隱藏視圖或任何東西,並且每當視圖可見時就添加觀察者,這可能是一個問題。我會建議在viewDidAppear中註冊這些事件,並且不要忘記刪除dealloc中的觀察者。

+0

謝謝你的迴應。我知道刪除觀察員。在這種情況下,猜測問題是將textView本身添加爲觀察者 – Cabus

0

你是繼承UITextView?如果是這樣,請檢查是否創建了該類的多個實例,並因此創建了多個觀察者。

在你的UITextView子類的init方法中設置一個斷點。如果它不止一次被觸發,那麼你的textDidChange處理程序會被多次調用。

要解決,你可以檢查的處理方法的UITextView中的每個實例:

if let textView = notification.object as? MyTextViewSubClass where textView === self { 
    print(textView.text) 
}