UIGestureRecognizer se estrella en
-
30-09-2019 - |
Pregunta
Esto es de esperar, pero me parece que no puede encontrar un tiempo de ejecución que funciona correctamente, ya que parece que era una API privada antes !!!!
En el momento en que tengo y responde OS3.1.3 al selector addGestureRecognizer !!!!
if ( [self.view respondsToSelector:@selector(addGestureRecognizer:)] ) {
UIGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(morePress)];
[self.view addGestureRecognizer:recognizer];
recognizer.delegate = self;
[recognizer release];
}
Solución
Se debe comprobar la versión del sistema explícitamente:
NSString *currentSystemVersion = [[UIDevice currentDevice] systemVersion];
if([currentSystemVersion compare:@"3.2"] == NSOrderedAscending) {
//add gesture recognizer
} else {
// :(
}
Otros consejos
UIGestureRecognizer no es soportado antes de iOS 3.2. Incluso si existe el método addGestureRecognizer:
, eso no significa que es seguro de usar.
Fue realmente un API privado y no se admite en las versiones anteriores a la 3.2.
doc de Apple dice:
Para determinar en tiempo de ejecución si se puede utilizar reconocedores en gesto su aplicación, prueba de si existe o no la clase y, si lo hace, asignar una instancia y ver si responde cheque al selector locationInView :. Este método no se agregó a la clase hasta iOS 3.2.
Código de ejemplo:
UIGestureRecognizer *gestureRecognizer = [[UIGestureRecognizer alloc] initWithTarget:self action:@selector(myAction:)];
if (![gestureRecognizer respondsToSelector:@selector(locationInView:)]) {
[gestureRecognizer release];
gestureRecognizer = nil;
}
// do something else if gestureRecognizer is nil
explicación necesaria:
Para determinar si una clase está disponible en tiempo de ejecución en un determinado iOS liberación, por lo general comprobar si la clase es nula. Desafortunadamente, esta prueba no es limpia precisa para UIGestureRecognizer. A pesar de que esta clase estaba a disposición del público a partir de iOS 3.2, fue en el desarrollo de un corto período de tiempo antes de eso. Aunque existe la clase de una versión anterior, el uso de la misma y otras clases de gestos son reconocedor No apoyado en esa versión anterior. No se debe intentar utilizar las instancias de esas clases.
Confirmar el texto completo aquí .