Apple es realmente divertido. Quiero decir, dicen que esto funciona:¿Cuál es el truco para pasar un evento al siguiente respondedor en la cadena de respuesta?
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch* touch = [touches anyObject];
NSUInteger numTaps = [touch tapCount];
if (numTaps < 2) {
[self.nextResponder touchesBegan:touches withEvent:event];
} else {
[self handleDoubleTap:touch];
}
}
Tengo un controlador de vista. Como ya sabes, View Controllers hereda de UIResponder. Ese controlador de vista crea un objeto MyView que hereda de UIView y lo agrega como una subvista a su propia vista.
Así tenemos:
Vista Controlador> tiene una vista (de forma automática)> tiene un MyView (que es un UIView).
Ahora dentro de MyView puse ese código como el anterior con un NSLog que imprime "tocado MyView". Pero reenvio el evento al siguiente respondedor, al igual que arriba. Y dentro del ViewController tengo otro método touchesBegan que solo imprime un NSLog como "controlador de vista tocado".
Ahora adivine qué: Cuando toco el MyView, se imprime "tocó MyView". Cuando toco fuera de MyView, que es la vista del VC, obtengo un "controlador de vista tocado". ¡Entonces ambos funcionan! Pero lo que no funciona es reenviar el evento. Porque ahora, en realidad, el siguiente respondedor debería ser el controlador de vista, ya que no hay nada más entremedio. Pero el método de manejo de eventos del VC nunca se llama cuando lo reenvío.
% $ &! § !!
Ideas?
Resueltas cosas raras El siguiente respondedor de MyView es la vista del controlador de vista. Eso tiene sentido, porque MyView es una subvista de eso. Pero no modifiqué esta UIView del controlador de vista. no es nada personalizado. Y no implementa ningún manejo de eventos táctiles. ¿No debería pasar el mensaje al controlador de vista? ¿Cómo podría dejarlo pasar? Si elimino el código de manejo de eventos en MyView, entonces el evento llega muy bien en el controlador de vista.
, gracias eJames. MyView me dice que el siguiente respondedor es exactamente la vista del controlador de vista. Las direcciones de memoria coinciden perfectamente. sin embargo, este toque de Bean no se llamará. pero ahora veo que este método se invocaría en la vista del controlador de vista, pero no en el controlador de vista en sí. pero entonces, ¿este evento no continuaría burbujeando hasta que el controlador de vista de la vista no lo maneje? ¿o es otro caso especial porque lo envío manualmente? –
Bueno, supongo que tiene sentido. La implementación predeterminada de 'touchesBegan:' no hace nada, así que una vez que la pasa al siguiente objeto 'UIView', simplemente termina. ¿Es factible simplemente pasar el evento táctil al viewController de forma manual? –
¿Has intentado llamar '[super touchesBegan: ...]' en lugar de '[self.nextResponder touchesBegan: ...]' He visto a algunas personas usar ese método, pero no estoy seguro de qué es lo que hace. –