2010-04-10 5 views
10

Estoy confundido acerca de la cadena de respuesta del iPhone. Específicamente, en la guía de manejo de eventos iPhone http://developer.apple.com/iPhone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html, tenemos lo siguiente:respondedores de iPhone

El primer respondedor es el objeto respondedor en una aplicación (generalmente un objeto UIView) designado como el primer destinatario de eventos que no sean táctiles .

Pero UIView es una subclase de UIResponder. Y la referencia de clase UIResponder dice esto:

- (BOOL)canBecomeFirstResponder 

Valor de retorno

SÍ si el receptor puede convertirse en el primer nivel de respuesta, NO lo contrario. Discusión

Devuelve NO de forma predeterminada. Si un objeto respondedor devuelve SÍ desde este método, se convierte en el primer respondedor y puede recibir eventos táctiles y mensajes de acción. Las subclases deben anular este método para poder ser el primero en responder.

Estoy confundido por la aparente contradicción. ¿Alguien puede aclararlo por mí?

Por lo que vale, configuré una simple aplicación basada en vistas, y llamé a canBecomeFirstResponder y isFirstResponder en su vista. Ambos respondieron NO.

Respuesta

9

Lo que esto significa es que el UIView básica no es capaz de convertirse en primer nivel de respuesta - que no hace nada con los eventos de movimiento, mensajes-menú de edición, etc.

Algunas subclases UIView (como UITextView) son capaces para ser el primero en responder, y usted puede escribir su propia subclase UIView que también lo haga.

16

La nomenclatura puede ser confusa. En lugar de "primer respondedor", piense en ello como "objetivo de evento inicial", es decir, el objeto que es el primer respondedor se convierte en el objetivo inicial para todos los eventos. En algunas API, esto también se denomina "foco", aunque en las API de Apple, que generalmente se reserva para describir Windows.

En cualquier momento, solo hay un primer destinatario/objetivo de evento inicial en la aplicación. Solo los objetos/instancias individuales pueden convertirse en un primer respondedor/intial-event-target. Las clases solo pueden definir si su instancia tiene la capacidad de convertirse en un primer respondedor/evento-inicial-objetivo. Una clase solo necesita proporcionar la capacidad de convertirse en el primer respondedor/evento inicial objetivo si tiene sentido hacerlo. Por ejemplo, un campo de texto obviamente necesita la habilidad de atrapar eventos para que pueda usar esos eventos para editarse. Por el contrario, una etiqueta estática no necesita tal capacidad.

Si una clase particular hereda de NSResonder no tiene relación con si la clase (o una instancia específica de la clase) se dejará establecer como el primer respondedor/inicial-evento-objetivo. Esa capacidad proviene únicamente de la respuesta de las instancias al mensaje canBecomeFirstResponder. La misma instancia puede rechazar ser el primer respondedor/evento inicial objetivo en un conjunto de condiciones y luego permitirlo más tarde cuando las condiciones cambian. Las clases pueden, por supuesto, conectar el estado si así lo desean.

En otras palabras, first-responder/intial-event-target es un estado de una instancia particular en un momento determinado. El primer respondedor/target-event-target es como un hot potato o un token que se transfiere de una instancia a otra en la UI. Algunas clases se niegan a tomar la patata caliente en absoluto. Algunos siempre lo hacen y otros lo agarran a veces e ignoran otros.