2012-06-22 5 views
9

Ich habe eine Taste, die ich verschwinden lassen will, wenn etwas anders als die Taste angetippt wird. Also habe ich das Ziel: Aktion: für die Löschtaste:Wird Button Tap Event durch Tippen auf Gesture Recognizer überschrieben?

[self.deleteButton addTarget:self action:@selector(deleteButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; 

später gefolgt durch Zugabe der tap Gestenerkenner zum umgebenden Ansicht:

[self.superview addGestureRecognizer:self.tapOutsideDelete]; 

Wenn ich das tue, wird die Aktion für DeleteButton ist nicht ausgeführt, als ob die Schaltfläche nicht erkannt wird. Der Gestenerkenner funktioniert in diesem Fall. Aber es funktioniert auch, wenn ich auf deleteButton tippe, was zu der Annahme führt, dass die Erkennung der Tippgeste Vorrang vor dem Antippen der Schaltfläche hat.

Wenn ich die Gestenerkennung entferne, funktioniert deleteButton korrekt.

Ich verstehe eindeutig nicht, wie diese beiden Ereignisse zusammen behandelt werden. Was muss ich tun?

(deleteButton imitiert die Schaltfläche zum Löschen einer Tabellenansichtszelle, aber in diesem Fall habe ich es in einer Headeransicht. Ich erwarte, eine Methode aufzurufen, um die Löschschaltfläche verschwinden zu lassen, wenn ich irgendwo in der Tabelle tippe die Taste selbst, genauso wie es in einer Zelle funktioniert.)

+0

Sie können bekommen ein bisschen Verrücktheit der Gestenerkenner Zugabe statt selbst zu self.superview (oder self.view wenn es sich um eine View-Controller ist). Dies würde es der Tabellenansicht hinzufügen, die die Header-Ansicht enthält, und nicht die Header-Ansicht, die möglicherweise nicht Ihren Vorstellungen entspricht. – MusiGenesis

+0

mögliches Duplikat von [Gestenerkennung und Tastenaktionen] (http://stackoverflow.com/questions/4825199/gesture-recognizer-and-button-actions) –

Antwort

12

Ja, die Tippgeste bekommt ersten Riss am Wasserhahn. Sie müssen die gestureRecognizer:shouldReceiveTouch: Methode implementieren:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
      shouldReceiveTouch:(UITouch *)touch { 

    if (touch.view == self.deleteButton) { 
     return NO; 
    } 
    return YES; 
} 
+2

Danke. Das hat perfekt funktioniert. Es dauerte ein wenig zu graben, um zu entdecken, dass dies eine Delegate-Methode des UIGestureRecognizerDelegate-Protokolls ist, so dass der Delegate-Zeiger ebenfalls festgelegt werden muss. – Jim

+0

@Jim: Entschuldigung, ich wollte das hinzufügen. Es ist frustrierend, dass so viele iOS-Tutorials usw. im Web nicht alle Informationen enthalten, die Sie für eine Lösung benötigen, und ich habe sie einfach hinzugefügt. – MusiGenesis

Verwandte Themen