Während Login (connect zum server) wird UIAlertView nicht angezeigt, erst beim beenden von der loginprozedur

  • Während Login (connect zum server) wird UIAlertView nicht angezeigt, erst beim beenden von der loginprozedur

    Hallo Leute,

    ich habe einen Login in meiner UIView, connect zum Server um eine XML herunterzuladen. Ich möchte einen Fortschrittsbalken oder einen hinweis mit Indicator anzeigen, während der Loginvorgang läuft. Doch wenn ich auf den Loginbutton klicke, wird der Screen gesperrt, ausgegraut und zum schluss, für einen sehr kurzen moment, wird meine UIAlertView angezeigt.

    Wo kann der fehler liegen? Wie kann ich es anders machen, sodass ich, während Daten geladen und verarbeitet werden, einen fortschrittsbalken oder alertview dargestellt bekomme?


    Quellcode

    1. UIAlertView *alertLogin = [[UIAlertView alloc] initWithTitle:nil message:@"\nBitte Warten, die Daten werden geladen!" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
    2. [alertLogin show];
    3. [...]
    4. [...]
    5. [...]
    6. ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    7. [request setPostValue:username forKey:@"username"];
    8. [request setPostValue:password forKey:@"pw"];
    9. [request startAsynchronous];
    10. [request cancelAuthentication];
    11. NSError *error = [request error];
    12. NSString *response = [request responseString];
    13. [...]
    14. [...]
    15. [...]
    16. } else {
    17. XLog("Login erfolgreich!");
    18. NSString * loginUserPW = [NSString stringWithFormat:@"http://###URL###?username=%@&pw=%@&s=iOS", username, password];
    19. NSURL *urlXML = [NSURL URLWithString: loginUserPW];
    20. [request redirectToURL:urlXML];
    21. ASIFormDataRequest *request2 = [[[ASIFormDataRequest alloc] initWithURL: urlXML] autorelease];
    22. [request2 startSynchronous];
    23. [...]
    24. [...]
    25. [alertLogin dismissWithClickedButtonIndex:0 animated:YES];
    26. [alertLogin release];
    Alles anzeigen
  • Quellcode

    1. - (void)loginWithAlertView:(UIAlertView *)alertView
    2. {
    3. ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    4. [request setPostValue:username forKey:@"username"];
    5. [request setPostValue:password forKey:@"pw"];
    6. [request startAsynchronous];
    7. [request cancelAuthentication];
    8. NSError *error = [request error];
    9. NSString *response = [request responseString];
    10. [...]
    11. [...]
    12. [...]
    13. } else {
    14. XLog("Login erfolgreich!");
    15. NSString * loginUserPW = [NSString stringWithFormat:@"http://###URL###?username=%@&pw=%@&s=iOS", username, password];
    16. NSURL *urlXML = [NSURL URLWithString: loginUserPW];
    17. [request redirectToURL:urlXML];
    18. ASIFormDataRequest *request2 = [[[ASIFormDataRequest alloc] initWithURL: urlXML] autorelease];
    19. [request2 startSynchronous];
    20. [...]
    21. [...]
    22. [alertView dismissWithClickedButtonIndex:0 animated:YES];
    23. }
    24. - (void)login
    25. {
    26. UIAlertView *alertLogin = [[UIAlertView alloc] initWithTitle:nil message:@"\nBitte Warten, die Daten werden geladen!" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
    27. [alertLogin show];
    28. [self performSelector:@selector(loginWithAlertView:) withObject:alertLogin afterDelay:0.1];
    29. [alertLogin release];
    30. }
    Alles anzeigen
  • brush51 schrieb:

    Danke für den Codeschnipsel. Das sperrt den Screen genau so. Ich weiß echt gar nicht mehr weiter.

    Was verstehst Du denn bitte genau unter "Das sperrt den Screen genau so."?

    Wenn Du bei dem o.a. Code die Login Methode aufrufst, dann sollte der AlertView erscheinen und danach die Methode loginWithAlertView: ausgeführt werden. Wenn die Methode fertig ist, dann sollte der AlertView wieder verschwinden.
  • MCDan schrieb:

    brush51 schrieb:

    Danke für den Codeschnipsel. Das sperrt den Screen genau so. Ich weiß echt gar nicht mehr weiter.

    Was verstehst Du denn bitte genau unter "Das sperrt den Screen genau so."?
    [...]
    Der Screen wird gesperrt, also wie es von einem UIAlertView üblich ist, grauer overlay und alle elemente sind nicht zugänglich. Aber ohne die UIAlertView(also die blaue box mit der Info).
    UIAlertView wird lediglich nach dem loginprozess kurzzeitig anzeigt.

    Verstehst du wie ich es meine?
  • Verstehe ich nicht, warum dies bei Dir nicht funktioniert.

    Es sollte eigentlich reichen, erst den AlertView anzuzeigen und dann den eigentlichen Login mit einem performSelector:withObject:afterDelay: zu starten, damit der MainThread Zeit hat, den AlertView auch anzuzeigen.

    Kommentiere mal diese Zeile in der login Methode aus:

    Quellcode

    1. // [self performSelector:@selector(loginWithAlertView:) withObject:alertLogin afterDelay:0.2];

    Wird der AlertView ohne den eigentlichen Login angezeigt?
  • MCDan schrieb:

    Verstehe ich nicht, warum dies bei Dir nicht funktioniert.

    Es sollte eigentlich reichen, erst den AlertView anzuzeigen und dann den eigentlichen Login mit einem performSelector:withObject:afterDelay: zu starten, damit der MainThread Zeit hat, den AlertView auch anzuzeigen.

    Kommentiere mal diese Zeile in der login Methode aus:

    Quellcode

    1. // [self performSelector:@selector(loginWithAlertView:) withObject:alertLogin afterDelay:0.2];

    Wird der AlertView ohne den eigentlichen Login angezeigt?
    Mir fällt gerade auf; Diese Methode wird gar nicht aufgerufen:

    Quellcode

    1. - (void)login{
    2. UIAlertView *alertLogin = [[UIAlertView alloc] initWithTitle:nil message:@"\nBitte Warten, die Daten werden geladen!" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
    3. [alertLogin show];
    4. [self performSelector:@selector(loginWithAlertView:) withObject:alertLogin afterDelay:0.1];
    5. [alertLogin release]; }


    Somit war auch der graue overlay nicht von dieser methode, sondern von meinem code überbeibsel. das habe ich jetzt raus.
    Also kurz gesagt. Es passiert gar nichts :)
  • Anstelle der Methode, welche Deinen ursprünglichen Code enthält, musst Du jetzt natürlich die neue Methode login aufrufen und die geänderte Methode loginWithAlertView: noch entsprechend ergänzen.

    Ich dachte dies wäre klar.

    Also anstelle von:

    Quellcode

    1. ...
    2. [self dieAlteMethode];
    3. ...

    musst Du jetzt natürlich:

    Quellcode

    1. ...
    2. [self login];
    3. ...

    verwenden.

    In welcher Methode befindet bzw. befand sich der ursprüngliche Code?
  • in der login methode habe ich nun meinen uialertview drin.

    statt dem alten uialert rufe ich self login auf. das ist in der methode loginWithAlertView.

    am anfang der loginWithAlertView sage ich auch

    Quellcode

    1. [self performSelectorOnMainThread:@selector(login) withObject:nil waitUntilDone:NO];




    funktioniert aber immer noch nicht wie es sollte.
  • Also noch mal, damit es verständlicher wird.

    Du musst nur die Methode startLogin aufrufen und nicht die Methode loginWithAlertView:, da diese von startLogin aufgerufen wird!

    Der AlertView wird ausschliesslich in startLogin erzeugt und angezeigt. Alles, bis auf [alertView dismissWithClickedButtonIndex:0 animated:YES], was mit dem AlertView zu tun hat, musst Du aus loginWithAlertView: entfernen!

    Quellcode

    1. - (void)startLogin
    2. {
    3. UIAlertView *alertLogin = [[UIAlertView alloc] initWithTitle:nil message:@"\nBitte Warten, die Daten werden geladen!" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
    4. [alertLogin show];
    5. [self performSelector:@selector(loginWithAlertView:) withObject:alertLogin afterDelay:0.1];
    6. [alertLogin release];
    7. }
    8. - (void)loginWithAlertView:(UIAlertView *)alertView
    9. {
    10. ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    11. [request setPostValue:username forKey:@"username"];
    12. [request setPostValue:password forKey:@"pw"];
    13. [request startAsynchronous];
    14. [request cancelAuthentication];
    15. NSError *error = [request error];
    16. NSString *response = [request responseString];
    17. [...]
    18. [...]
    19. [...]
    20. } else {
    21. XLog("Login erfolgreich!");
    22. NSString * loginUserPW = [NSString stringWithFormat:@"http://###URL###?username=%@&pw=%@&s=iOS", username, password];
    23. NSURL *urlXML = [NSURL URLWithString: loginUserPW];
    24. [request redirectToURL:urlXML];
    25. ASIFormDataRequest *request2 = [[[ASIFormDataRequest alloc] initWithURL: urlXML] autorelease];
    26. [request2 startSynchronous];
    27. [...]
    28. [...]
    29. [alertView dismissWithClickedButtonIndex:0 animated:YES];
    30. }
    Alles anzeigen
  • Ich habe das alles genannte versucht. Funktioniert aber nicht. Ich bekomme immernoch den grauen overlay angezeigt und der hinweis erscheint erst am ende.
    Und die Zeile 14 erzeugt einen absturz.

    Also hier nochmal mein code:

    Quellcode

    1. - (void)login { UIAlertView *alertLogin = [[UIAlertView alloc] initWithTitle:nil message:@"\nBitte Warten, die Daten werden geladen!" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
    2. [alertLogin show];
    3. [self performSelector:@selector(btnLogin:) withObject:alertLogin afterDelay:0.2];
    4. [alertLogin release];}
    5. //- (void) btnLogin:(id) sender {
    6. - (void) btnLogin:(UIAlertView *) alertView {
    7. XLog(@"btnLogin betaetigt");
    8. if (onOffMode.on) {
    9. XLog(@"Online Modus!");
    10. [self login];
    11. [...]
    12. }
    13. [alertView dismissWithClickedButtonIndex:0 animated:YES]; //erzeugt einen crash
    14. //unrecognized selector sent to instance}
    Alles anzeigen
  • Nichts für ungut, aber vielleicht solltest Du noch mal etwas zum Thema Programmierung und Objective-C lesen, sonst wirst auf Dauer nicht weit kommen.

    Mir ist auch nicht klar, warum Du nicht den o.a. Source Code von mir übernimmst und die Methode loginWithAlertView: um den eigentlichen Login bzw. die von Dir mit [...] angegebenen Stellen mit dem original Code ergänzt und alles ausser [alertView dismissWithClickedButtonIndex:0 animated:YES], was mit dem AlertView zu tun hat, entfernt?