UIGestureRecognizer feuern zweimal?
Ich habe eine UITapGestureRecognizer auf viewDidLoad meiner view-controller aber irgendwie ist es feuert die selector-Methode zweimal für eine einzelne Tippen Sie auf.
UITapGestureRecognizer *g = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openInMapsApp:)] autorelease];
[self.mapView addGestureRecognizer:g];
Meine Methode:
-(void)openInMapsApp:(UIGestureRecognizer*)g {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@""
message:@"This will open this location in the Maps application. Continue?"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"OK",nil];
[alertView show];
[alertView release];
}
- Ist es möglich, dass dies nur geschehen irgendwann?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gesture recognizers sende-Aktion mit anderen Geste Zustand. Also es ist kein bug. Problemumgehung:
Ich hatte ein Doppelzimmer
UIAlertView
kommen. Wie gezeigt, von Nicolas Rostov oben, dieser arbeitete für mich. Sowohl dieUIGestureRecognizerStateEnded
und dieUIGestureRecognizerStateRecognized
Staaten erstellt eine neue alertView, wenn[alertView show]
verwendet wurde, in den block. Mit //[alertView show] auskommentiert, beide noch immer zeigte sich auf der Konsole, aber nur eine Aktion stattfand.Kann ich bestätigen das gleiche. Ich habe einen bug-report an Apple mit einem Beispielprojekt demonstriert das Problem.
Die vorübergehende Lösung, die ich gefunden habe, ist das deaktivieren der UITapGestureRecognizer unmittelbar vor dem anzeigen der Warnmeldung. Dann, in der uialertview-Objekt delegate-Methode(N) implementieren, aktivieren Sie es. Dies erfordert, dass Sie zu verfolgen, GR irgendwie, aber es scheint, wie die meisten elegante Lösung für die Zeit-sein.
Mithilfe der Beispiel-code oben:
Ich hatte das gleiche problem, und ich bemerkte die zweite Veranstaltung hatte der Staat UIGestureRecognizerStateCancelled (während das erste war UIGestureRecognizerStateEnded), also eine andere Problemumgehung ist, um das Ereignis zu ignorieren in diesem Fall.
Ich einfach gelöst, ein ähnliches Problem. Es stellte sich heraus, dass ich hatte zwei tap gesture recognizers Hinzugefügt, um die anzeigen mit dem Aufruf. Die Art und Weise fand ich heraus, ist durch NSLogging die gestik-Erkennung, wenn der Selektor aufgerufen wird.
An deiner Stelle, würde ich prüfen, um sicherzustellen, dass Sie nicht zwei gesture recognizers - ein aus dem storyboard, und eine, die programmgesteuert erstellt, zum Beispiel.
Ich habe einen timer der Ansicht, dass überprüft wird, ob die Berührung war mindestens eine halbe Sekunde vor und ignorieren die zweite Berührung, wenn es zu früh ist.
Dies ist nur ein workaround, aber. Ich würde gerne noch fix das eigentliche problem.
Dieser ruft den alertview sofort nach dem Gestenereignis. für eg: wenn Sie longtap Veranstaltung der alertview wird angezeigt, sobald Sie nehmen Sie Ihren finger. Aber UIGestureRecognizerStateBegan Zustand wird automatisch aufgerufen, wenn die Geste wird automatisch erkannt.
Ich habe das gemacht und gearbeitet:
ersten initialisieren ein Mitglied auf die handling-Objekt speichert die letzten streichen NSTimeInterval
Fügen Sie diesen code in Ihre Methode