2014-12-15 8 views
14

Capisco che un primo oggetto risponditore è che riceve un segnale di richiamata in base all'attività di input, ecc. E che lo bolla sulla catena fino a quando non si trova un rispondente disposto a gestirlo.Qual è una definizione formale di un primo risponditore in iOS?

Ma più formalmente, qual è lo scopo del primo risponditore? Ad esempio, è un risponditore a livello di applicazione? Sembra che essere un primo interlocutore sta semplicemente dicendo che questo particolare oggetto riceverà una notifica di interazione. Un altro risponditore può rubare il primo stato di risponditore?

Per favore spiegami o indirizzami ad alcune informazioni pertinenti. Ho letto la spiegazione generale di Apple su cosa sia un risponditore. Sto cercando una spiegazione che sia un po 'più costruita.

risposta

11

L'ambito di un primo risponditore in iOS è determinato dalla gerarchia delle viste. Ricorda, un rispondente fa parte di una gerarchia di responder e viene definito dalla documentazione di Apple:

Un risponditore è un oggetto che può rispondere agli eventi e gestirli. Tutti gli oggetti responder sono istanze di classi che in definitiva ereditano da UIResponder (iOS) o NSResponder (OS X).

In pratica, tutti i soccorritori fanno parte di una catena di potenziali risponditori che arrivano fino all'applicazione stessa. Ciò significa che l'ambito di risposta del risponditore è determinato da quanto in alto deve essere la catena per ottenere un oggetto in grado di gestire una risposta. Se il primo risponditore è un elemento dell'interfaccia utente, ad esempio un UITextField, l'ambito è legato all'ambito di tale risponditore.

In questa immagine, prima gerarchia risponditore iOS è mostrata a sinistra (OS X a destra):

First Responder Hierarchy

Per rispondere alla seconda parte della domanda, sì, gli oggetti possono 'rubare' primo stato di responder se un utente interagisce con un elemento, ad esempio:

  1. L'utente fa clic su textField1. Ora è il primo a rispondere.
  2. L'utente fa clic su textField2. Ha assunto lo status di primo risponditore da textField1.

... e si può conferire primo stato risponditore su di loro con determinate funzioni:

[textField3 becomeFirstResponder]; //This is now the first responder 
[textField4 becomeFirstResponder]; //Now textField2 has 'stolen' first responder status 
[textField4 resignFirstResponder]; //The text field has resigned its first responder status to the next level up 

Per chiunque altro leggendo questo che non ha colpito fino documentazione di Apple su questo, un buon punto di partenza è la spiegazione della gerarchia Responder trovata qui: https://developer.apple.com/library/ios/documentation/General/Conceptual/Devpedia-CocoaApp/Responder.html

Spero che questo aiuti!

+0

Grazie per la risposta. Per ulteriori chiarimenti, quando un elemento si dimette dallo stato di primo soccorritore, significa che l'ultimo elemento che è diventato il primo risponditore in precedenza, diventa nuovamente il primo risponditore? –

+0

Non funziona. Quando chiami 'resignFirstResponder', significa semplicemente che non esiste un risponditore designato come corrente. Non hai un primo soccorritore in ogni momento. –

+0

Per dirla in termini molto profani, si può chiamare "onFocus"? –

10

È una proprietà della finestra. La finestra non ha mai più di un primo risponditore. Qualsiasi UIResponder può richiedere il primo stato di responder inviando becomeFirstResponder, ed è per questo che puoi far sì che un UITextField ottenga "focus" inviandogli quel messaggio.

+0

Questa è esattamente la risposta che sto cercando. Quindi, se per esempio un altro componente diventa il primo soccorritore, ruberà la messa a fuoco per se stesso? –

+0

Corretto, se riesce a diventare il primo soccorritore. (Può _try_ diventare primo soccorritore e fallire). Ce ne può essere solo uno. – matt

+0

Potrebbe essere utile leggere questa sezione del mio libro: http://www.apeth.com/iOSBook/ch11.html#_the_responder_chain – matt

Problemi correlati