objective-c cocoa nib first-responder

objective c - "Primer Respondedor"-¿Lo entendí bien?



objective-c cocoa (4)

Imagen general correcta, detalles de implementación incorrectos en el primer párrafo.

Un "Primer Respondedor" en un NibFile es un Objeto ...

No, en realidad, First Responder es nil . Conectar un control de IU (por ejemplo, un botón) al Primer Respondedor en un plumín es equivalente a [control setTarget:nil] en el código.

El motivo del objeto falso de Primer Respondedor en la ventana de plumilla es que, en IB, establece el objetivo y la acción al mismo tiempo (ctrl-drag para llegar al objetivo, elija la acción del menú emergente). No puede establecer la acción y dejar el objetivo sin configurar, como lo hace en el código, por lo que para establecerlo en nil , debe hacerlo explícitamente. Para eso es First Responder: es un objeto falso que representa nil , por lo que puedes establecer el objetivo y la acción de la misma manera que lo harías al establecerlo en un objetivo real específico.

Por supuesto, no puede usar esto para establecer nada más a nil , solo los objetivos de las vistas. Solo puede usarlo para referirse a First Responder, nada más.

Entonces, si el usuario hace clic en un control de UI, el Nib establece ...

El plumín no hace nada. Es solo una colección liofilizada de objetos almacenados en el disco. Incluso cuando crea una instancia de NSNib, todo lo que hace es descongelar algunos objetos. Son los objetos los que hacen las cosas.

En el caso que nos ocupa, cuando desarchivas el control que conectaste al Primer Respondedor desde el plumín, su objetivo se establece en nil (recuerda, eso es lo que realmente es el Primer Respondedor: un objetivo de nil ). Cuando el objetivo de un control es nil , y el usuario hace clic en él, envía su acción a la respuesta que sea el primero en responder en ese momento.

Su segundo y tercer párrafo son correctos.

Permítanme resumir esto en breve: Un "Primer Respondedor" en un archivo de punta es un objeto, que representa el elemento de control de UI que tiene el foco del usuario. Por lo tanto, si el usuario hace clic en un control, los conjuntos de plumillas que hicieron clic en el control de la IU actuarán como Primer Respondedor. En mi aplicación podría hacer una salida a ese "Primer Respondedor" desde la punta, para poder, por ejemplo, enviar un mensaje "hacer color de fuente rojo" a lo que el usuario haya activado haciendo clic.

Y luego, si este control de interfaz de usuario de First Responder no comprende ese mensaje, el mensaje se pasa a la cadena de respuesta, hasta que un elemento padre o elemento de control de interfaz de usuario (o abuelo) (y así sucesivamente) entienda el mensaje. De lo contrario, será ignorado.

Por lo tanto, First Responder siempre establece un "enlace" al control de UI que tiene foco. ¿Está bien?


Tu comprensión es incompleta La cadena de respuesta incluye más de lo que normalmente consideraríamos como "controles de IU", incluido lo más importante, el documento actual. Uno de los grandes beneficios es que le permite interactuar con la ventana conceptualmente "actual" (ventana actual, campo de texto actual, documento actual, etc.) sin tener que lidiar demasiado para encontrarla.


Un respondedor es cualquier objeto que realizará acciones (funciones de llamada) cuando ocurran eventos (como hacer clic en botones). La cadena de respuesta es una secuencia de objetos, cada uno de los cuales está contenido, por ejemplo, un botón dentro de un panel dentro de una ventana. Cuando ocurre un evento, iteramos a través de la cadena hasta que encontramos un objeto que no tiene un respondedor establecido en nil y que, por lo tanto, puede responder al evento. Entonces, en lugar de proporcionar un objeto de respuesta para cada botón en una ventana, podemos proporcionar un solo respondedor para toda la ventana. El primer respondedor es simplemente el primer objeto dentro de la cadena de respuesta: vincular un evento al primer respondedor permite que el evento pase por alto la cadena.


Verifique este enlace. Explica un buen trabajo. Creo que tienes la esencia de esto:

http://cocoadev.com/FirstResponder

De la fuente:

FirstResponder es el primer objeto en la cadena de respuesta que tiene la oportunidad de responder a un evento.