2010-04-10 89 views
10

我對iPhone響應者鏈感到困惑。具體而言,iPhone事件處理引導http://developer.apple.com/iPhone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html中,我們有以下:iPhone第一響應者

第一響應是在一個應用程序(通常是一個UIView對象)的響應者對象被指定爲比觸摸事件的其它事件的第一接收方。

但UIView是UIResponder的子類。而UIResponder類參考這樣說:

- (BOOL)canBecomeFirstResponder 

返回值

YES,如果接收器可以成爲第一個響應者,否則爲NO。 討論

默認返回NO。如果響應者對象從此方法返回YES,則它將成爲第一響應者,並且可以接收觸摸事件和操作消息。子類必須重寫此方法才能成爲第一響應者。

我對這個明顯的矛盾感到困惑。任何人都可以爲我清理它嗎?

對於它的價值,我設置了一個簡單的基於視圖的應用程序,並在其視圖上調用canBecomeFirstResponder和isFirstResponder。兩人都退回了NO。

回答

9

這意味着什麼是基本的UIView是不是能夠成爲第一個響應者 - 它沒有做任何處理移動事件,編輯菜單信息等

一些UIView的子類(如UITextView的)能成爲第一響應者,你也可以編寫你自己的UIView子類。

16

命名可能會讓人困惑。而不是「第一響應者」將其視爲「初始事件目標」,即作爲第一響應者的對象成爲所有事件的初始目標。在一些API中,這也被稱爲「焦點」,儘管通常用於描述Windows的Apple API中。

在任何給定時間,應用程序中只有一個第一響應者/初始事件目標。只有單個對象/實例才能成爲第一響應者/初始事件目標。類只能定義它們的實例是否有能力成爲第一響應者/初始事件目標。一個類只需提供成爲應用程序的第一響應者/初始事件目標的能力,只要這樣做是有意義的。例如,文本字段顯然需要能夠捕捉事件,以便它可以使用這些事件來編輯它自己。相比之下,靜態標籤不需要這種功能。

一個特定的類是否從NSResonder繼承,與類(或類的特定實例)是否將自己設置爲第一響應者/初始事件目標無關。這種能力僅來自實例對canBecomeFirstResponder消息的迴應。同一個實例可以在一組條件下拒絕成爲第一響應者/初始事件目標,然後在條件改變時再允許它。如果他們願意的話,課程當然可以強化這種狀態。

換句話說,first-responder/intial-event-target是特定時間特定實例的狀態。第一響應者/初始事件目標就像是一個燙手的馬鈴薯或在UI中從實例切換到實例的令牌。有些班級完全拒絕搶熱馬鈴薯。有些人總是這樣做,有些人會抓住它而忽略其他人。

相關問題