2010-04-10 14 views
10

Sono confuso riguardo alla catena di risposta dell'iPhone. In particolare, nel iPhone gestione degli eventi guida http://developer.apple.com/iPhone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html, abbiamo le seguenti:Primo soccorritore per iPhone

Il primo responder è l'oggetto risponditore in un'applicazione (di solito un oggetto UIView) che è designato ad essere il primo destinatario di eventi diversi eventi di tocco .

Ma UIView è una sottoclasse di UIResponder. E il riferimento di classe UIResponder dice questo:

- (BOOL)canBecomeFirstResponder 

Return Value

SI se il ricevitore può diventare il primo soccorritore, NO altrimenti. Discussione

Restituisce NO di default. Se un oggetto risponditore restituisce SÌ da questo metodo, diventa il primo risponditore e può ricevere eventi di tocco e messaggi di azione. Le sottoclassi devono sovrascrivere questo metodo per essere in grado di diventare il primo soccorritore.

Sono confuso dall'apparente contraddizione. Qualcuno può chiarirlo?

Per quello che vale, ho creato una semplice applicazione basata su una vista e chiamo canBecomeFirstResponder e isFirstResponder sulla sua vista. Entrambi hanno restituito NO.

risposta

9

Ciò significa che l'UIView di base non è in grado di diventare il primo risponditore - non fa nulla con eventi di movimento, i messaggi editing del menu, ecc

Alcune sottoclassi UIView (come UITextView) sono in grado diventare il primo soccorritore e puoi scrivere la sottoclasse UIView che fa altrettanto.

16

La nomenclatura può essere fonte di confusione. Invece di "first responder", pensalo come "target dell'evento iniziale", cioè l'oggetto che è il primo responder diventa l'obiettivo iniziale per tutti gli eventi. In alcune API questo è anche chiamato "focus", sebbene nelle API Apple che di solito è riservato per descrivere Windows.

In qualsiasi momento, nell'app è presente un solo oggetto di primo intervento/evento-evento. Solo i singoli oggetti/istanze possono diventare un primo-risponditore/un evento-evento-obiettivo. Le classi possono semplicemente definire se la loro istanza ha la capacità di diventare un obiettivo first-responder/intial-event. Una classe deve solo fornire la capacità di diventare il primo soggetto risponditore/intial-event-target dell'app se ha senso farlo. Ad esempio, un campo di testo ha ovviamente bisogno della capacità di intercettare gli eventi in modo che possa utilizzare quegli eventi per modificarsi. Al contrario, un'etichetta statica non ha bisogno di tale capacità.

Se una particolare classe eredita da NSResonder non ha alcuna influenza sul fatto che la classe (o un'istanza specifica della classe) si lascerà impostare come primo-risponditore/evento-obiettivo-obiettivo. Tale capacità proviene esclusivamente dalla risposta delle istanze al messaggio canBecomeFirstResponder. La stessa istanza può rifiutarsi di essere il primo-responder/intial-event-target in una serie di condizioni e quindi consentirla in un secondo momento quando le condizioni cambiano. Le classi possono naturalmente cablare lo stato, se lo desiderano.

In altre parole, first-responder/intial-event-target è uno stato di una particolare istanza in un determinato momento. Il primo-responder/intial-event-target è come una patata bollente o un token che viene distribuito dall'istanza all'istanza nell'interfaccia utente. Alcune classi si rifiutano di afferrare la patata bollente. Alcuni lo fanno sempre e altri lo afferrano a volte e lo ignorano.