4

我檢測到鍵盤將顯示下面的代碼。但是,當我使用pushViewController推到另一個屏幕並在該屏幕中打開鍵盤時,keyboardWillShow會被調用!這真的是對的嗎?UIKeyboardWillShowNotification從堆棧中的下一個班級錯誤調用

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillShow:) 
              name:UIKeyboardWillShowNotification 
              object:nil]; 
// register for keyboard notifications 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillHide:) 
              name:UIKeyboardWillHideNotification 
              object:nil]; 

回答

14

是的,這是正確的行爲。 由於推動另一個視圖的視圖仍然存在,並且通知在應用程序範圍內。

您可以刪除通知的:

- (void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 

    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:UIKeyboardWillShowNotification 
                object:nil]; 

    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:UIKeyboardWillHideNotification 
                object:nil]; 
} 

如果你想設置的觀察者然後從viewDidLoad中你的代碼的地方viewWillAppear中:(BOOL)動畫:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillShow:) 
              name:UIKeyboardWillShowNotification 
              object:nil]; 
    // register for keyboard notifications 
    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillHide:) 
              name:UIKeyboardWillHideNotification 
              object:nil]; 
} 
+1

雖然+1您可能想提及如何刪除該通知的觀察者。 –

+0

是的Praveen。我只是試圖找出在哪裏把下面的代碼 - [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; –

+0

類似 - (void)viewDidUnload { [super viewDidUnload]; \t [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; //取消註冊鍵盤通知,但不可見。 [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; } –