2011-12-10 15 views
5

Estoy tratando de averiguar por qué me sale un error cuando uso locationOfTouch: inView. Eventualmente, creé una nueva vista solo con la llamada a locationOfTouch y todavía obtengo un SIGABRT cada vez que toco la vista.locationOfTouch resultados en SIGABRT

Aparte de las declaraciones de importación, aquí es todo el código en mi opinión:

@interface Dummy : UIView <UIGestureRecognizerDelegate> { 
    UIPanGestureRecognizer *repositionRecognizer; 
} 

@end 

Aquí está la impl:

@implementation Dummy 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     repositionRecognizer = [[UIPanGestureRecognizer alloc] 
       initWithTarget:self 
         action:@selector(reposition:)]; 
     [repositionRecognizer setDelegate:self]; 
     [self addGestureRecognizer:repositionRecognizer]; 

     self.backgroundColor = [UIColor grayColor]; 
    } 
    return self; 
} 

- (void)reposition:(UIGestureRecognizer *) gestureRecognizer { 
    [gestureRecognizer locationOfTouch:0 inView:self]; 
    //[gestureRecognizer locationInView:self]; 
} 

@end 

Si uso locationInView, funciona bien. Si uso locationOfTouch: inView, el programa se cancela tan pronto como el toque finaliza.

EDITAR: En la consola, con esta clase, no se muestran mensajes de error. El IDE apunta a main.m con un SIGABRT. Al hacer clic en 'Continuar' se obtiene 'EXC_BAD_INSTRUCTION'. Captura de pantalla disponible en http://imageshack.us/photo/my-images/849/consolel.png/

+1

Por favor, publique el mensaje de error de la consola. – zaph

+0

La consola está en blanco. Mira aquí: http://imageshack.us/photo/my-images/849/consolel.png/ – undetected

+0

En tu consola gdb> haz un backtrace o bt para ver la última pila que se colgó. Establezca la variable de entorno NSZombieEnabled en YES y depure su código. – 0x8badf00d

Respuesta

8

Esto falla porque supone que hay un toque cero. Es necesario confirmar que hay una primera, así:

- (void)reposition:(UIGestureRecognizer *) gestureRecognizer { 
    if (gestureRecognizer.numberOfTouches > 0){ 
     CGPoint point = [gestureRecognizer locationOfTouch:0 inView:self]; 
     NSLog(@"%@",NSStringFromCGPoint(point)); 
    } 
} 

Piense en la parte "locationOfTouch:", como diciendo "touchAtIndex:", si la matriz de toques está vacía (Al levantar el dedo o lo mueve fuera de la pantalla) entonces no hay touchAtIndex:0.

+0

Gracias, eso funcionó. – undetected

Cuestiones relacionadas