Pause-code-Ausführung bis uialertview-Objekt-button gedrückt wird?
Einer meiner Methoden, sendet eine Nachricht an ein Objekt (was wissen Sie über dass), und erwartet einen BOOL für eine Antwort. Allerdings BOOL Antwort, die es erwartet wird, ist auf der Grundlage der Antwort auf eine uialertview-Objekt erstellt, in das empfangende Objekt die Methode. Allerdings ist der code nicht anhalten, während der Wartezeit für den Benutzer zu beantworten, die uialertview-Objekt. Mein problem ist: wie benutze ich -alertView:clickedButtonAtIndex in Rückgabewerts der Methode?
Hier ist der code, der die Nachricht läuft (in diesem Bau, ich hatte erwartet, navigateAwayFromTab zu ändern, auf der Grundlage der Benutzereingabe in die uialertview-Objekt, aber es wird nie eine chance):
- (BOOL)readyToNavigateAwayFromTab {
NSLog( @"message received by Medical View");
navigateAwayFromTab = NO;
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Navigate Away From Tab?"
message:@"Navigating away from this tab will save your work."
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"OK", nil
];
[alert show];
[alert release];
return navigateAwayFromTab;
}
#define CANCEL 0
#define OK 1
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if( buttonIndex == OK ) navigateAwayFromTab = YES;
}
Ich gelesen habe bis auf den modal uialertview-Objekt-Debatte, und ich Stimme mit apples Umsetzung - zumindest als die Regel. Aber in diesem Fall sehe ich keine Möglichkeit, lösen das problem, indem Sie code in -alertView:clickedButtonAtIndex, weil ich nicht brauchen, um code auszuführen, basierend auf der uialertview-Objekt, ich muss nur die Antwort Lesen. Irgendwelche Vorschläge, wie kann ich erreichen, mein Gefängnis? Ich habe versucht, eine while-Schleife nach [alert show] schon, aber dann die Warnung gar nicht zeigen, dann, und für eine Reihe von Gründen, die ich nicht benutzen kann -viewWillDisapear.
Bearbeiten
Für diejenigen Leser, diese Frage in den modernen ios-ära, diese Frage bezogen sich auf ios 2
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht nur uialertview-Objekt zeigen nicht warten, bis der Benutzer eine Taste Antippen, es muss nicht einmal warten, bis die Alarm-Ansicht eingeblendet. Es gibt sofort.
Hinzufügen einer Kennzeichnung zu Ihrer Klasse. Wenn es NEIN, zurück NICHT aus readyToNavigateAwayFromTab und zeigen Sie Ihre Warnung. In clickedButtonAtIndex, setzen Sie das Kennzeichen, so dass readyToNavigateAwayFromTab weiß, zurückzukehren, JA. Noch in clickedButtonAtIndex, wiederholen Sie die tab-navigation von code.
Lösung mit NSCondition beim auslösen von einem hintergrund-thread:
Raphael
Beste Lösung, die ich habe finden, ist von Sasmito Adibowo in seinem blog-post Schmerzlos Uialertview-Objekt. Er erstellt BSAlertViewDelegateBlock, eine generische UIAlertViewDelegate-Implementierung, ermöglicht die Verwendung von closures als delegate handler.
Hier ist, wie Sie es verwenden:
Die Umsetzung der BSAlertViewDelegateBlock.h und BSAlertViewDelegateBlock.m sind verfügbar auf GitHub, aber ich habe umgebucht, den code hier:
BSAlertViewDelegateBlock.h
BSAlertViewDelegateBlock.m
Den
[alert show]
Aussage halten sollte, bis die Anwendung, bis eine Antwort übermittelt wird.Haben Sie Ihre controller abonnieren Sie die
UIAlertViewDelegate
Protokoll? Prüfen Sie, ob Sie brauchen, um hinzuzufügen<UIAlertViewDelegate>
zu Ihrer Steuerung header-Datei, z.B.:Könnten Sie auch Ihre
navigateAwayFromTab
variable eine Eigenschaft, z.B.:In der Umsetzung: