Probleme UIAlertView

  • Probleme UIAlertView

    Guten Abend zusammen,

    ich habe eine Frage zu einem UIAlertView.

    Ich möchte die Antwort (ja/nein) auswerten. Folgender Code:


    ...
    UIAlertView *saveAlert = [[UIAlertView alloc] initWithTitle:@"Datenschutzhinweis" message:@"Text" delegate:self cancelButtonTitle:@"Nein" otherButtonTitles:@"Ja" , nil];
    [saveAlert show];
    ...
    }

    - (void)alertView:(UIAlertView *)saveAlert clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 0)
    {
    NSLog(@"Es wurde NEIN gedrückt");
    }
    else
    {
    NSLog(@"Es wurde JA gedrückt");
    }
    }



    Wenn ich delegate:self bei UIAlertView *saveAlert setze, schmiert mir die App ab. Wenn ich delegate:nil setze, wird die Methode - (void)alertView:(UIAlertView *)saveAlert clickedButtonAtIndex:(NSInteger)buttonIndex nicht aufgerufen.

    Was stimmt denn nicht?

    Gruß
    bernd
    Ich bin gegen Signaturen!!!
  • Tuni schrieb:

    Im Header UIAlertViewDelegate gesetzt? Rufst du den Dialog aus einem Background Thread auf? Bin mir nicht mehr sicher, aber vor ein paar Wochen hatte ich Probleme mit einem UIAlertView und verschiedenen Threads. An Details erinnere ich mich gerade nicht.


    Ja, hab ich

    @interface EinstellungenViewController : UIViewController <UIAlertViewDelegate, UIApplicationDelegate>

    Ist kein Backgroundthread
    Ich bin gegen Signaturen!!!
  • Tuni schrieb:

    Im Header UIAlertViewDelegate gesetzt?

    Die Angabe ist nur wichtig, damit conformsToProtocol: das richtige Ergebnis liefert. Für die Benutzung des UIAlertView ist es aber nicht entscheidend.

    beage schrieb:

    Muss ich denn überhaupt das Delegate verwenden?

    Ja.

    beage schrieb:

    Komm ich nicht irgendwie anders in der Methode direkt hinter dem [saveAlert show] an den Status des gedrückten Buttons?

    Nein, die Methode show kehrt ja sofort zurück und Dein Programm läuft weiter. Der UIAlertView wird asynchron angezeigt.

    Geschieht denn die Anzeige des UIAlertViews in der selben Klasse, wo die Delegate Methode implementiert ist? Weil hier bei mit in einer Testapp funktioniert Dein Code ohne Änderungen wunderbar.

    Michael
  • Michael schrieb:



    Geschieht denn die Anzeige des UIAlertViews in der selben Klasse, wo die Delegate Methode implementiert ist? Weil hier bei mit in einer Testapp funktioniert Dein Code ohne Änderungen wunderbar.

    Michael


    Ja, ist in der selben Klasse.
    Ich habs in ein neues Projekt eingefügt und da funktioniert es auch.
    Clean hab ich auch schon gemacht.
    Ich weiss echt nicht mehr weiter :(
    Ich bin gegen Signaturen!!!
  • Ich hab hier nochmal den Code. Beides in einer Klasse. Vielleicht findet ja jemand noch was.

    Quellcode

    1. - (IBAction)saveButtonPressed:(id)sender {
    2. NSString *urlDatenString = [NSString stringWithFormat:@"http://xxxxxxxx];
    3. NSURL *urlDaten = [NSURL URLWithString:urlDatenString];
    4. NSData *Datendata = [NSData dataWithContentsOfURL:urlDaten];
    5. NSString *checklogin = [[NSString alloc] initWithData:Datendata encoding:NSUTF8StringEncoding];
    6. if ([checklogin isEqualToString:@"login ok"] || ([feld_mail.text isEqualToString:@""] && [feld_passwort.text isEqualToString:@""])) {
    7. NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    8. if([userDefaults objectForKey:@"personalisiert"] != nil) // zum Testen umgedreht
    9. {
    10. UIAlertView *saveAlert = [[UIAlertView alloc] initWithTitle:@"Datenschutzhinweis" message:@"Um Ihnen per Push-Nachrichtendienst den Status Ihrer Bestellungen senden zu können, müssen wir Ihre E-Mail-Adresse Ihrem Gerät zuweisen. Dazu wird Ihre E-Mailadresse bei uns gespeichert.\r\nWir versichern Ihnen, dass Ihre Daten nicht an Dritte weitergegeben werden!\r\n\r\nSind Sie mit der Speicherung Ihrer E-Mail-Adresse einverstanden?" delegate:nil cancelButtonTitle:@"Nein" otherButtonTitles:@"Ja" , nil];
    11. [saveAlert show];
    12. }
    13. zugang_dic = [[NSMutableDictionary alloc] init];
    14. zugang_arr = [[NSMutableArray alloc] init];
    15. [zugang_dic setObject:feld_mail.text forKey:@"mail"];
    16. [zugang_dic setObject:feld_passwort.text forKey:@"passwort"];
    17. zugang_arr = [zugang_dic mutableCopy];
    18. [[NSUserDefaults standardUserDefaults] setObject:zugang_arr forKey:@"zugangsdatenArray"];
    19. [[NSUserDefaults standardUserDefaults] synchronize];
    20. [self.navigationController popViewControllerAnimated:YES];
    21. }
    22. else {
    23. UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Fehler" message:@"Zugangsdaten sind falsch!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    24. [errorAlert show];
    25. }
    26. }
    27. - (void)alertView:(UIAlertView *)saveAlert clickedButtonAtIndex:(NSInteger)buttonIndex {
    28. if (buttonIndex == 0)
    29. {
    30. NSLog(@"Es wurde NEIN gedrückt");
    31. }
    32. else
    33. {
    34. NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    35. NSString *token = [[NSUserDefaults standardUserDefaults] valueForKey:@"Tokenstring"];
    36. NSString *urlDatenString = [NSString stringWithFormat:@"http://xxxxxxxx];
    37. NSURL *urlDaten = [NSURL URLWithString:urlDatenString];
    38. [NSData dataWithContentsOfURL:urlDaten];
    39. [userDefaults setInteger:1 forKey:@"personalisiert"];
    40. NSLog(@"Es wurde JA gedrückt");
    41. }
    42. }
    Alles anzeigen


    Grüße
    Bernd
    Ich bin gegen Signaturen!!!
  • Halleluja! Ich habs!

    @Michael: Das warder entscheidende Hinweis "Nein, die Methode show kehrt ja sofort zurück und Dein Programm läuft weiter. Der UIAlertView wird asynchron angezeigt."

    Die Rückkehr in den TableView beim Speichern mit [self.navigationController popViewControllerAnimated:YES];
    Das muss natürlich jetzt hier rein - (void)alertView:(UIAlertView *)saveAlert clickedButtonAtIndex:(NSInteger)buttonIndex

    Danke Euch!!!
    Ich bin gegen Signaturen!!!