Apple è davvero divertente. Voglio dire, dicono che questo funziona:Qual è il trucco per passare un evento al prossimo risponditore nella catena di risposta?
- (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];
}
}
Ho un controller di visualizzazione. Come sai, View Controller eredita da UIResponder. Quel Controller Vista crea un oggetto MyView che eredita da UIView e lo aggiunge come sottoview alla propria vista.
Quindi abbiamo:
View Controller> ha una vista (automaticamente)> ha un MyView (che è un UIView).
Ora all'interno di MyView ho inserito il codice come sopra con un NSLog che stampa "touched MyView". Ma inoltro l'evento al prossimo risponditore, proprio come sopra. E all'interno del ViewController ho un altro tocco: metodo Began che stampa un NSLog a la "touched view controller".
Ora indovina cosa: Quando tocco MyView, viene stampato "MyView" toccato. Quando tocco fuori da MyView, che è la vista del VC, ricevo un "controller di visualizzazione toccato". Quindi entrambi funzionano! Ma ciò che non funziona è l'inoltro dell'evento. Perché ora, in realtà, il prossimo risponditore dovrebbe essere il controller della vista, dal momento che non c'è nient'altro in mezzo. Ma il metodo di gestione degli eventi del VC non viene mai chiamato quando lo inoltro.
% $ &! § !!
Idee?
Capito roba strana prossimo risponditore di MyView è la vista del controller della vista. Questo ha senso, perché MyView è una sottoview di questo. Ma non ho modificato questo UIView dal controller della vista. non è niente di personalizzato E non implementa alcuna gestione di eventi touch. Il messaggio non dovrebbe essere trasmesso al controller della vista? Come potrei lasciarlo passare? Se rimuovo il codice di gestione degli eventi in MyView, l'evento arriva correttamente nel controller della vista.
eJames Grazie. MyView mi dice che il prossimo risponditore è esattamente la vista del controller della vista. Gli indirizzi di memoria corrispondono perfettamente. tuttavia, questo tocca Began non verrà chiamato. ma ora vedo che questo metodo verrebbe invocato sulla vista del controller della vista, ma non sul controller stesso della vista. ma allora, questo evento non continuerà a ribollire fino al controller di vista della vista non lo gestisce? o è un altro caso speciale perché lo invio manualmente? –
Beh, suppongo che abbia senso. L'implementazione predefinita di "touchesBegan:" non fa nulla, quindi una volta passata al prossimo oggetto 'UIView', termina semplicemente. È possibile passare manualmente l'evento touch al ViewController manualmente? –
Hai provato a chiamare '[super touchesBegan: ...]' invece di '[self.nextResponder toccaBegan: ...]' Ho visto alcune persone che usano quel metodo, ma non sono sicuro di cosa faccia. –