3 Stimmen

Warum stürzt die App ab, wenn ein UIAlertView angezeigt wird?

Ich habe die Reachability-Funktion in einer Methode implementiert, die alle Serveranfragen verarbeitet. Durch NSLogs kann ich sehen, dass die Funktion perfekt funktioniert. Es gibt jedoch nie eine "Pause" innerhalb der Methode, was bedeutet, dass ich das UIAlertView nicht verwenden kann, ohne dass das Programm abstürzt.

Vielleicht gehe ich das komplett falsch an, aber ich kann nichts anderes finden...

Hat jemand eine Idee, wie man irgendwie Benachrichtigungen anzeigen kann?

Vielen Dank im Voraus

CODE:

-(id) getJson:(NSString *)stringurl{
Reachability * reach = [Reachability reachabilityWithHostname:@"www.google.com"];

NSLog(@"erreicht %d", reach.isReachable);

if (reach.isReachable == NO) {

   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Passwörter stimmen nicht überein."
     message:@"Die Passwörter stimmen nicht überein. Bitte versuchen Sie es erneut."
     delegate:nil
     cancelButtonTitle:@"OK"
     otherButtonTitles:nil];
     [alert show];

}else{
    id x =[self getJsonFromHttp:stringurl];
    return x;
}
return nil;
}

2voto

eric Punkte 4813

Nachdem wir die Diskussion in einen Chat verschoben haben, haben wir festgestellt, dass Ihr UIAlertView aus einem Hintergrundthread aufgerufen wurde. Führen Sie niemals etwas im Zusammenhang mit der Aktualisierung der Benutzeroberfläche (Benutzeroberfläche) in einem Hintergrundthread aus. Das UIAlertView aktualisiert die Benutzeroberfläche, indem es einen kleinen Pop-up-Dialog hinzufügt, daher sollte dies im Hauptthread erfolgen. Beheben Sie dies, indem Sie die folgenden Änderungen vornehmen:

// (1) Erstellen Sie eine neue Methode in Ihrer .m/.h-Datei und verschieben Sie Ihren UIAlertView-Code dorthin
-(void)showMyAlert{ 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Passwörter stimmen nicht überein." 
                           message:@"Die Passwörter stimmen nicht überein. Bitte versuchen Sie es erneut." 
                           delegate:nil 
                               cancelButtonTitle:@"OK" 
                           otherButtonTitles:nil]; 
    [alert show]; 

}

// (2) Ersetzen Sie in -(id)getJson Ihren ursprünglichen UI-Code durch einen Aufruf Ihrer neuen Methode
[self performSelectorOnMainThread:@selector(showMyAlert)
                             withObject:nil
                          waitUntilDone:YES];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X