2011-09-07 63 views
8

我感到困惑severals第一響應點:瞭解系統邏輯急救員

  1. 如果我打電話- becomeFirstResponder,做系統調用– canBecomeFirstResponder第一?爲什麼?
  2. 爲什麼有- becomeFirstResponder– canBecomeFirstResponder?在什麼情況下他們可以返回不同的值?
  3. 應用程序每次都必須有第一響應者嗎?如果是這樣,當我在某個對象上調用– resignFirstResponder時發生了什麼? UIApplication立即成爲第一響應者,還是在響應者鏈中的某個點上引發了「令牌」?當我想擺脫朝聖者標記時,我可以撥打- becomeFirstResponderUIApplication對象嗎?
  4. ...

請別人給我解釋一下,系統如何管理它的第一個響應者。當某個對象成爲第一響應者時,發生在什麼情況下,當什麼時候第一響應者辭職。系統會做什麼?謝謝!

回答

6
  1. becomeFirstResponder的默認實現確實調用canBecomeFirstResponder。這是因爲從canBecomeFirstResponder返回NO的響應者不應該成爲第一響應者。
  2. becomeFirstResponder如果成功,會使接收器成爲第一響應者。 canBecomeFirstResponder只是檢查接收者是否願意成爲第一響應者,而沒有實際改變任何東西。如果當前第一響應者拒絕辭職,那麼becomeFirstResponder可能會失敗。在其他情況下,becomeFirstResponder也可能會失敗。
  3. 代碼中沒有任何第一響應者狀態。通過專用UIResponder方法firstResponder來判斷,在這種情況下,系統不會分配任何特定的默認值。

基本上,當一些想成爲第一個響應者當前的第一響應者(如果有的話)被要求辭職,然後將新對象將成爲第一個響應者。這可能會導致系統顯示屏幕鍵盤或採取其他措施。當第一響應者辭職時,這可能同樣會導致系統隱藏屏幕鍵盤或採取其他措施。

當一個非觸摸事件進來時,它首先被傳遞到UIWindow。 UIWindow將它傳遞給第一響應者。該文檔似乎並沒有說明UIWindow是否嘗試處理事件本身(並且如果它不處理它本身,就像平常一樣傳遞給UIApplication),或者如果沒有第一響應者就忽略該事件。詳細請參照the documentation