Bug in Alertview auf dem iPhone?
-
20-08-2019 - |
Frage
Ich schreibe ein Stück Code zu "do etwas-> zeigen alert1-> do etwas-> zeigen alert 2".
//do something
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Alert 1"
message:nil
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
//do something
UIAlertView *alert2 = [[UIAlertView alloc]
initWithTitle:@"Alert 2"
message:nil
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert2 show];
[alert2 release];
Und plötzlich geschah etwas Seltsames an mehrere AlertViews: Es zeigt "Alarm 1" -> "Alert 2" (Drücken Sie auf 'OK') -> "Alarm 1". Warum „Alarm 1“ zeigt wieder? Ich habe keine Delegatmethode noch geschrieben. Vielleicht ein Fehler? (Danke an cobbal, alert 1 ist immer noch da, wenn alert 2 erscheint.)
Ich finde - (void) Alertview: (UIAlertView *) Alertview clickedButtonAtIndex: (NSInteger) buttonIndex funktioniert gut. Ist der Delegatmethode ein gemeinsamer Weg mehrere alertViews zu zeigen?
Lösung
Ich würde vermuten, dass alert 1 gezeigt wird, und dann durch Alarm 2 abgedeckt, da Show ist nicht modal. Wenn Alarm 2 geschlossen ist, Alarm 1 ist noch offen.
Um Ihre zweite Frage, alertView:didDismissWithButtonIndex:
kann besser arbeiten, aber ich habe nicht wirklich, dass getestet.
Andere Tipps
Der Beauftragte ist so, dass Sie benachrichtigt werden kann, wenn die Warnung des Feldes verwiesen, und die Taste, um es verwendet wurde zu entlassen. Es hat keinen Einfluss, ob die Warnung überhaupt das Feld verwiesen.
Der Alarm bleibt sichtbar, bis er entlassen wird entweder durch eine Taste tippen. (Falls vorhanden - sie nicht benötigt werden) oder Sie entweder [UIAlertView dismissWithClickedButtonIndex:animated]
oder (undokumentiert) dismiss
Methode der Alarminstanz aufrufen
Es sieht aus wie (wie Cobbal vorgeschlagen), Alarm 2 über Alarm Aufspringen 1, Sie Alarm 2 entlassen, und alert 1 bleibt (bis er sich des Feldes verwiesen).
Gibt es einen bestimmten Grund, warum Sie eine neue Warnung angezeigt werden soll, während ein anderer noch zeigt? Vielleicht etwas mehr Kontext würde uns helfen, an die Wurzel des Problems zu bekommen, was ich vermute, kann ein Design-Problem sein.
[Bearbeiten] zurück zu kommender und Lesen wieder frage ich mich, ob das, was Sie fragen, um mit dem Delegatmethode, ob Sie von dort 2 Alarm zeigt werden sollen? In diesem Fall, das ist wahrscheinlich das, was Sie wollen - ob direkt oder indirekt. Durch indirekt meine ich, dass Sie an anderer Stelle gesetzt etwas Zustand haben können, ob Alarm 2 bestimmt, soll (oder die Umstände, die dazu führen können) angezeigt. Dieser Zustand (ein Flag, vielleicht) könnte eingestellt werden, wenn Sie den ersten Alarm zeigen, und gelöscht, wenn der Alarm (vom Delegatmethode) das Feld verwiesen.
Der Grund, warum dies passiert ist, weil UIAlertView nicht blockiert, während es zeigt. Jeder Code geschrieben, nachdem ein Alertview zeigt läuft gerade nach dem Alarm angezeigt wird.
Was sollten Sie haben zwei verschiedene Methoden. Einer, der etwas tut, und dann zeigt eine Warnung, und dann eine andere, die etwas tut, und zeigt einen weiteren Alarm.
die erste Methode Kick off etwas zu tun, und eine Warnung zu zeigen, und dann in den Alarm des Delegatmethode Haken, und wenn Sie den Rückruf von der Alertview erhalten, die andere Methode ausgeführt werden.
Auf diese Weise wird der zweite Teil des Prozesses nicht passieren, bis der Benutzer auf dem Alarm OK in dem ersten Teil des Prozesses gedrückt hat.