2011-09-09 8 views
8

Tengo una vista con varios UIButtons. Implementé exitosamente UILongPressGestureRecognizer con lo siguiente como selector;En un UILongPressGestureRecognizer ¿cómo puedo detectar qué objeto generó el evento?

- (void)longPress:(UILongPressGestureRecognizer*)gesture { 
    if (gesture.state == UIGestureRecognizerStateEnded) { 
     NSLog(@"Long Press"); 
    } 
} 

Lo que necesito saber dentro de este método es el que recibió el UIButton LongPress ya que necesito hacer algo diferente, según el botón que recibió el LongPress.

Afortunadamente la respuesta no es un problema de mapeo de las coordenadas de donde se produjo la pulsación larga a los límites de los botones, prefiero no ir allí.

¿Alguna sugerencia?

Gracias!

Respuesta

10

Esto está disponible en gesture.view.

1

Si su vista contiene varias subvistas (como un montón de botones) se puede determinar lo que se dio un golpecito:

// Get the position of the point tapped in the window co-ordinate system 
CGPoint tapPoint = [gesture locationInView:nil]; 

UIView *viewAtBottomOfHeirachy = [self.window hitTest:tapPoint withEvent:nil]; 

if ([viewAtBottomOfHeirachy isKindOfClass:[UIButton class]]) 
3

¿Desea agregar el controlador gesto de pulsar larga a la UIView que tiene las UIButtons como subvistas? Si es así, algo parecido al enfoque de @Magic Bullet Dave es probablemente el camino a seguir.

Una alternativa es subclase UIButton y agregar a cada UIButton un longTapGestureRecogniser. A continuación, puede obtener su botón para hacer lo que quiera. Por ejemplo, podría enviar un mensaje que se identifique a un controlador de vista. El siguiente fragmento ilustra los métodos para la subclase.

- (void) setupLongPressForTarget: (id) target; 
{ 
    [self setTarget: target]; // property used to hold target (add @property and @synthesise as appropriate) 

    UILongPressGestureRecognizer* longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:button action:@selector(longPress:)]; 
    [self addGestureRecognizer:longPress]; 
    [longPress release]; 
} 

- (void) longPress: (UIGestureRecognizer*) recogniser; 
{ 
    if (![recogniser isEnabled]) return; // code to prevent multiple long press messages 
    [recogniser setEnabled:NO]; 
    [recogniser performSelector:@selector(setEnabled:) withObject: [NSNumber numberWithBool:YES] afterDelay:0.2]; 

    NSLog(@"long press detected on button"); 

    if ([[self target] respondsToSelector:@selector(longPressOnButton:)]) 
    { 
     [[self target] longPressOnButton: self]; 
    } 
} 

En el controlador de vista es posible que tenga código de algo como esto:

- (void) viewDidLoad; 
{ 
    // set up buttons (if not already done in Interface Builder) 

    [buttonA setupLongPressForTarget: self]; 
    [buttonB setupLongPressForTarget: self]; 

    // finish any other set up 
} 

- (void) longPressOnButton: (id) sender; 
{ 
    if (sender = [self buttonA]) 
    { 
     // handle button A long press 
    } 

    if (sender = [self buttonB]) 
    { 
     // handle button B long press 
    } 

    // etc. 

} 
+0

si ([target auto [] respondsToSelector: @selector (longPressOnButton :)]) { [target auto [] longPressOnButton: self]; } this if-block no compila ... dio error como: no se conoce ningún método de instancia como ... – trillions

+0

Lo descubrí ... agregué un protocolo y lo arreglé. Gracias.. – trillions

Cuestiones relacionadas