2009-02-28 16 views
31

Consentitemi di riassumere quanto segue: Un "First Responder" in un file pennino è un oggetto, che rappresenta l'elemento di controllo dell'interfaccia utente che ha il focus dell'utente. Quindi, se l'utente fa clic su un controllo, il pennino imposta il controllo dell'interfaccia utente selezionato come Primo risponditore. Nella mia app potevo fare uno sbocco a quel "First Responder" dal pennino, in modo che potessi ad esempio inviare un messaggio "make red font color" a qualsiasi cosa l'utente abbia attivato facendo clic."First Responder" - Ho capito bene?

E quindi, se questo controllo dell'interfaccia utente First Responder non capisce quel messaggio, il messaggio viene passato nella catena di risposta, fino a quando un elemento genitore o nonno (e così via) elemento di controllo dell'interfaccia utente capisce il messaggio. Altrimenti sarà ignorato.

Quindi First Responder stabilisce sempre un "collegamento" al controllo dell'interfaccia utente che ha il focus. È giusto?

risposta

42

Immagine complessiva corretta, dettagli di implementazione errati nel primo paragrafo.

A "First Responder" in un NibFile è un oggetto ...

No, in realtà, First Responder è nil. Il collegamento di un controllo dell'interfaccia utente (ad es. Pulsante) a First Responder in un pennino equivale a [control setTarget:nil] nel codice.

Il motivo per l'oggetto falso del primo risponditore nella finestra del nib è che, in IB, si impostano il bersaglio e l'azione contemporaneamente (tenendo premuto il tasto Ctrl e trascinando il puntatore, scegliere l'azione dal menu a comparsa). Non è possibile impostare l'azione e lasciare il target disinserito, come è possibile nel codice, quindi impostarlo su nil, è necessario farlo in modo esplicito. Ecco a cosa serve First Responder: è un oggetto falso che rappresenta nil, quindi puoi impostare il target e l'azione nello stesso modo in cui lo faresti quando lo imposti su un target reale specifico.

Ovviamente, non è possibile utilizzarlo per impostare altro a nil, solo gli obiettivi delle viste. Puoi solo usarlo per significare First Responder, non altro.

Quindi, se le klicks utente su un controllo dell'interfaccia utente, il pennino set ...

Il pennino non fa nulla. È solo una raccolta congelata di oggetti archiviati su disco. Anche quando installi NSNib, tutto ciò che fai è scongelare alcuni oggetti. Sono gli oggetti che fanno le cose.

Nel caso in esame, quando si richiama il controllo connesso alla First Responder dal pennino, il suo obiettivo è impostato su nil (ricordate, questo è ciò che First Responder è in realtà: un obiettivo di nil). Quando l'obiettivo di un controllo è nil e l'utente fa clic su di esso, invia la sua azione a qualsiasi risponditore che sia il primo a rispondere in quel momento.

Il secondo e il terzo paragrafo sono corretti.

+0

grazie. Puoi spiegare cosa intendi per "bersaglio"? – Thanks

+0

http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/chapter_6_section_5.html#//apple_ref/doc/uid/TP40002974-CH7-SW31 –

+0

@Peter, il link nel commento sopra è rotto – Casebash

2

Controllare questo collegamento fa un buon lavoro che spiega. Penso che tu abbia l'essenza di esso:

http://cocoadev.com/FirstResponder

Dalla fonte:

Il firstResponder è il primo oggetto nella catena risponditore che viene dato la possibilità di rispondere a un evento .

+1

il link che hai postato qui è attualmente rotto – GoreDefex

3

La tua comprensione è incompleta. Lo responder chain include più di quello che normalmente pensiamo come "controlli dell'interfaccia utente", incluso soprattutto il documento corrente. Uno dei grandi vantaggi è che ti permette di interagire con il concettualmente "corrente" qualunque cosa - la finestra corrente, il campo di testo corrente, il documento corrente, ecc. - senza un sacco di confusione per trovarlo.

2

Un risponditore è un oggetto che eseguirà azioni (funzioni di chiamata) quando si verificano eventi (come il clic sui pulsanti). La catena di risposta è una sequenza di oggetti ciascuno contenuto l'uno nell'altro, ad esempio un pulsante all'interno di un pannello all'interno di una finestra. Quando si verifica un evento, iteriamo attraverso la catena finché non troviamo un oggetto che non ha un risponditore impostato su nil e che quindi può rispondere all'evento. Quindi, invece di fornire un oggetto risponditore per ogni pulsante in una finestra, possiamo fornire un singolo risponditore per l'intera finestra. Il primo risponditore è semplicemente il primo oggetto all'interno della catena del risponditore: il collegamento di un evento al primo risponditore consente all'evento di superare la catena.

Problemi correlati