2010-07-11 25 views
0

我很難理解iPhone應用程序中響應器鏈的工作原理。如何恢復以前的firstResponder?

我的情況如下。我有兩個UIViewControllers安裝在標籤欄控制器上。稱它們爲視圖控制器A和B.它們在意義上無關,因爲它們都沒有引用或不瞭解對方。

A和B需要到遠程控制事件(播放/暫停/停止按鈕)作出響應。控制器A一直想要響應這些事件,而B只想在用戶選擇某個功能時對它們做出響應。當我的應用程序啓動時,A立即成爲第一響應者,並能夠接收遙控事件。當B想要接收的事件,它成爲第一個響應,然後開始得到事件,而不是A.

當B使用遙控器完成,會出現問題。此時,B自己調用resignFirstResponder。此後,A和B都不能獲得任何遙控事件。

我以爲,當B辭職第一響應狀態,以前是第一個響應者將被恢復的事情。這不是它的工作原理嗎?

如果不是,我該如何將A還原爲第一響應者?請記住,A和B是單獨的選項卡,因此B沒有對A的引用或者知道A應該是第一個響應者。所以我不想在A上明確地調用becomeFirstResponder。相反,我需要的是一種獲得前一個響應者並恢復它的方式(我認爲)。我有點困惑,爲什麼這不會自動發生。

感謝, 弗蘭克

回答

1

The docs on UIResponder還有Event handling guide for iPhone OS表明響應鏈是不完全的規定,您如何希望它是。它並不是一個可以被追蹤和被追蹤的潛在響應者鏈接。相反,它直接與當前呈現給用戶的視圖層次關聯。

這是什麼意思是當B辭職的第一個響應者時,B的視圖控制器(如果有的話)或者它的超級視圖成爲第一響應者,假設已經執行canBecomeFirstResponder:。如果它不能,視圖控制器或超級視圖成爲第一響應者,一路達到UIApplication

如果A和B都沒有在層次結構中,其中一個是另一個的子視圖,響應鏈不會第一響應迴歸A當B辭職。相反,B將辭退第一響應者的超級觀點。你最可能要做的就是在A和B之上的視圖中實現becomeFirstResponder:。該方法只需將第一響應者交給A即可。這樣,B可以搶先響應者,之後當它退出時,超級觀點會把它交回A.

+0

謝謝,我試了一下,你的解釋是有道理的。視圖B是否成爲第一響應者實際上並不重要。只要我切換到其選項卡,視圖A就停止成爲第一響應者,並停止獲取遠程控制事件。 在我的情況下,常見的超級視圖可能是標籤欄控制器的視圖。我必須繼承UITabBarController來做我想要的嗎? – user332000 2010-07-13 04:50:05

+0

是的 - 子類UITabBarController似乎工作。當沒有其他人在監聽時,該子類獲取遠程控制事件。現在我所要做的就是找出將事件派往正確位置的一種優雅方式。 – user332000 2010-07-13 05:04:41

+0

調用A的「becomeFirstResponder:」方法將第一響應者交給A.IIRC。 – Kalle 2010-07-13 08:08:59