2009-07-14 7 views
0

Ich arbeite an einer iPhone-Anwendung. Wenn die Anwendung gestartet wird, authentifiziere ich, stelle eine Restful-Verbindung her, erhalte Daten in Form einer XML-Datei, analysiere sie und zeige sie dann in Form einer Tabellenansicht an. Hier ist mein Problem. Wenn die Benutzerinformationen bereits in der Anwendung gespeichert sind oder wenn sie im Code fest codiert sind, verwendet die Anwendung den Benutzernamen und das Kennwort für die Authentifizierung und fährt mit der Anzeige der Daten im Tabellenformat fort. Ich habe bis jetzt mit fest codierten Daten getestet. Jetzt möchte ich eine andere Ansicht anzeigen, die nach Benutzername und Passwort fragt, wenn sie nicht in der Anwendung vorhanden ist ... i.e. Ich möchte den Benutzernamen und das Passwort dynamisch anstatt statisch machen. In meinem Fall, wenn die Verwendung ist beschäftigt Eingabe des Benutzernamens und des Kennworts, versucht die "viewDidLoad" -Methode, eine Verbindung mit dem Server mit leerer Benutzername und Passwort fehlgeschlagen beim Server-Verbindung und dem Laden der Tabelle. Wenn ich die Anwendung zum zweiten Mal ausführe, findet die Anwendung den Benutzernamen und das Passwort, die zuvor eingegeben wurden, und lädt die Tabellen in Ordnung.Wie verzögere ich eine Methode?

Gibt es eine Möglichkeit, den Prozess der Serververbindung zu verzögern, wenn die Anwendung den Benutzernamen und das Passwort nicht finden? Wie kann ich die Serververbindungsmethode signalisieren, nachdem der Benutzer seinen Benutzernamen und sein Passwort eingegeben hat?

Danke für Ihre Hilfe.

Antwort

1

Können Sie etwas von Ihrem Code veröffentlichen? Es ist schwer zu spekulieren, ohne zu sehen, was vor sich geht, aber ich werde es trotzdem versuchen.

Sie müssen den Code, wo Sie mit dem Server verbinden out of ViewDidLoad verschieben und es in eine Callback-Methode oder etwas einfügen. Ich würde vorschlagen, eine Warnung mit einem Feld für den Namen und das Passwort zu werfen, Ihren View-Controller zum Stellvertreter des Alarms zu machen und dann die clickedButtonAtIndex-Funktion mit dem Server verbinden zu lassen.

Beispiel:

-(void)viewDidLoad { 
    UIAlertView *loginAlert = [[UIAlertView alloc] initWithTitle:@"Login" message:@"Please enter your username and password below" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Login",nil]; 

    //You might have to do some fiddling with the frame sizes to make it fit in the alert. 
    UITextField *userNameField = [[UITextField alloc] initWithFrame:CGRectMake(originX, originY, lengthX, lengthY)]; 
    userNameField.placeholder = @"User Name"; 
    [loginAlert addSubview:userNameField]; 
    //loginAlert will retain this so we release it now. 
    [userNameField release]; 



    [UITextField *passwordNameField = [[UITextField alloc] initWithFrame:CGRectMake(originX, originY, lengthX, lengthY)]; 
    passwordNameField.secureTextEntry = YES; 
    [loginAlert addSubview:passwordNameField]; 
    [passwordNameField release] 

    //This line tells the iPhone to stretch out your AlertView so it's big enough for your two textViews, we use 0 and 130 respectively but we only have one text field. 
    CGAffineTransform myTransform = CGAffineTransformMakeTranslation(stretchX, stretchY); 

    [loginAlert setTransform:myTransform]; 
    [loginAlert show]; 
    [loginAlert release]; 
} 


//Implement this method, it will be called when the user clicks the "login" button on your alert. 
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    //Usually if they click cancel you do nothing, thats buttonIndex 0 
     if(buttonIndex == 1) { 
     //Connect to the server with the correct login and password. 
    } 
} 
+0

Hallo Tim, Vielen Dank für Ihren Vorschlag zu sein . Durch die Eingabe des Benutzernamens und des Passworts mithilfe einer Warnung wurde mein Problem gelöst. Ich habe den Benutzernamen und das Passwort in einer zweiten Ansicht eingegeben. Daher kam es zu einem Problem beim erneuten Laden der Tabellenansichten in der Stammansicht, wenn in der zweiten Ansicht auf die Schaltfläche "Anmelden" geklickt wurde. Meine Stammansicht ist komplex, da sie einen Tab-Controller, einen Navigations-Controller, eine Tabellenansicht und ein segmentiertes 3-Tasten-Steuerelement enthält. So fand ich es schwierig, die Stammansichtstabellen zu aktualisieren, wenn in der Unteransicht auf die Login-Schaltfläche geklickt wurde. Danke für deinen Vorschlag, es funktioniert jetzt großartig. –

+0

Wir freuen uns, Ihnen behilflich zu sein! –

+0

Ich bin ziemlich sicher, dass das Hinzufügen eines UITextField zu einem UIAlert gegen Apples HIG ist. Wenn Sie diese Software im App Store einreichen möchten, ist es möglicherweise sicherer, statt einer UIAlert eine modale Ansicht anzuzeigen (mit -presentModalViewController: animated :). – leolobato

0

Sobald Sie eine Ansicht in einem Fenster anzeigen, wird ViewDidLoad IMMER aufgerufen, deshalb heißt es viewDidLoad ... Was Sie tun müssen, ist eine andere Ansicht für die Login-Schritte zu erstellen, wenn der Benutzer fertig ist und sich anmeldet Sie klicken auf eine Login-Schaltfläche, die die Ansicht, die mit Ihrem erholsamen Dienst verbunden ist, anstößt. Wenn die Benutzerdaten bereits vorhanden sind, dann überspringen Sie die Anmeldeseite alle zusammen und gehen Sie direkt zu Ihrer Tabellenansicht

+0

Sie können auch natürlich nicht den gesamten Code haben, der die Tabelle Laden in viewDidLoad der Fall ist, stattdessen eine andere Methode, die aufgerufen wird, wenn Sie es brauchen – Daniel

Verwandte Themen