2012-02-23 14 views
5

Mi aplicación tiende a perder a veces la pista de qué respondedor debe manejar un evento táctil.El evento UIButton no se manejó el 1% del tiempo: ¿a quién debo culpar en mi cadena de respuesta?

Mi situación:

  • un archivo XI ter definiendo 3 vistas:
    • una vista como vista del propietario del archivo vistas
    • 2 adicionales que se agregan a la jerarquía de la vista mediante programación
  • Una de las subvistas (SubviewA) tiene un UIButton, configurado para enviar el selector myAction: al FirstResponder cuando se detecta evento "Touch Up Inside"
  • SubviewA sabe cómo manejar myAction:

99% del tiempo, todo va bien. Cuando el usuario pulsa el botón, SubviewA se ocupa del mensaje myAction: y todo está bien. Pero de vez en cuando, los usuarios se quejan de que el botón "se congela" y yo mismo lo reproduje un par de veces sin poder encontrar un escenario claro para hacerlo a pedido.

Mi investigación hasta ahora es:

  • cuando no ocurre nada al pulsar el botón:
    • mi botón detecta el grifo causa se pone de relieve cuando se pulsa
    • myAction: no se llama en SubviewA
    • el resto de la interfaz de usuario sigue siendo receptiva

El código del que estoy hablando es algún código heredado que estoy tratando de corregir. Tener una vista respondiendo a un evento para una de sus subvistas me parece una arquitectura extraña. Hasta ahora, siempre he usado el propietario del archivo para encargarme de los eventos táctiles, así que señalé que la cadena respondedora es la responsable ideal del error. ¡Pero no puedo encontrar por qué! Desde mi entendimiento, como el botón no sabe cómo manejar el mensaje y no tiene ningún controlador de vista conectado, debería reenviarlo a su supervista (¡Botón A, que sabe cómo manejarlo)!

Mis preguntas son:

  • alguna idea de donde el insecto podría venir de? (¿cadena de respuesta?)
  • ¿Algún comentario sobre si una vista debería manejar sus propios comportamientos de botón o si un controlador de vista debería hacerlo?

Editar: Tengo una idea sobre cómo solucionar el error: alambre de la acción del botón directamente a SubviewA en lugar de utilizar FirstResponder dentro Interface Builder. La razón por la que publiqué esta pregunta es para tratar de entender por qué la cadena de respuesta no funciona de vez en cuando.

+0

Se agradable ver algún código ... – tarmes

+0

Código no .m implicado: solo archivos XIB, que no son realmente fáciles de compartir. –

Respuesta

1

¿Puedes hacer que SubviewA becomeFirstResponder y luego renunciar cuando haya terminado?

+0

Mi plan para arreglar mi error es conectar la Acción del botón directamente a SubviewA en lugar de a FirstResponder dentro de Interface Builder. Lo que quiero saber es POR QUÉ no funciona con FirstResponder. –

1

Cuando los toques se manejan en una subvista, generalmente no se pasan por la cadena. Entonces, por ejemplo, si está capturando toques en el controlador de vista de la vista de contenido, obtendrá toques en UILabel porque no los está capturando. Esos eventos pasan a la vista de contenido y luego al controlador. Pero no verá ningún toque en UIButton ya que esa clase los está atrapando (recuerde que UIButton interpreta una cantidad de secuencias táctiles, no solo retoques internos).

Por esta razón, necesitará subclase UIButton para ver los toques. Cuando hagas eso, asegúrate de pasar siempre los eventos a la súper clase cuando hayas terminado con ellos, de lo contrario, UIButton no funcionará correctamente. Ver Subclassing Notes en el UIControl Class Reference. También eche un vistazo a Control Events in that reference, así como algunos de los métodos de instancia para asegurarse de que realmente necesita captar los toques en su código. Tenga en cuenta, por ejemplo, que UIButton hereda la capacidad de rastrear toques desde UIControl.

+0

su respuesta tiene sentido, pero no entiende el sentido de mi pregunta: mi archivo xib explícitamente le decía a mi botón que llamara a myAction al primer respondedor para un evento de retoque interno. Entonces, ¿por qué lo extraña a veces? –

Cuestiones relacionadas