• Wieder einmal haben uns unsere Apfeltalker tolle Fotos zur Abstimmung eingesandt. Welches ist Euer Favorit? Stimmt mit ab! Hier geht es zur Abstimmung --> Klick
  • Es ist bereits Apfeltalk-Tradition und wir möchten sie auch in diesem Jahr fortsetzen: Unser Apfeltalk-Weihnachtslogo-Wettbewerb hat begonnen! Gestaltet für uns das Weihnachtsbanner, das im Monat Dezember bis zum Weihnachtsfest unsere Webseite schmücken soll. Lasst Eurer Kreativität freien Lauf! Hier geht es zum Wettbewerb --> Klick

Rückgabe von Werten nach Schließen eines Views

T-A-Z

Roter Delicious
Registriert
13.10.08
Beiträge
93
Guten Tag allerseits,

ich hänge zZ bei meiner iPhone App an einem Problem das ich seit Tagen, schon fast Wochen, nicht gelöst kriege. Zuerst eine grobe Beschreibung wie meine App abläuft:
App startet - angezeigt wird der RootView, eine Tabelle.
Aus dem viewDidLoad des RootViews wird das Loginfenster geladen:
Code:
LoginViewController *modalController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil];
	[self presentModalViewController:modalController animated:YES];
	[modalController release];
Folglich wird mein Loginfenster über den RootView gelegt. Im Fenster selber gibt der Benutzer seinen Namen und sein Passwort ein. Ein Server überprüft die Daten und gibt eine UserID zurück (0 bei falscher Kombination).
Ist die Kombination korrekt (also UserID !=0) wird das Loginfenster geschlossen:
Code:
[self dismissModalViewControllerAnimated:YES];

Jetzt kommt das eigentliche Problem: Für die weitere Verarbeitung benötige ich die UserID an verschiedenen Stellen in der App. Nur wie kann ich das lösen?

Bei meiner Suche habe ich 3 Möglichkeiten gefunden: Singleton, statische Variable, Variable im Application Delegate.

Nur leider habe ich zu keiner der Möglichkeiten eine (ausreichend ausführliche) Dokumentation gefunden, die einem Neuling wie mir das erklären. Leider sind auch meine allgemeinen Programmierkentnisse etwas eingerostet, und macht die Sucherei für mich nicht einfacher...

Achja, ich habe keine Probleme einem neuen View, beim erstellen, Variablen zu übergeben. Das löse ich problemlos über folgenden Code:
Code:
DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];
		dvController.selectedPlan = selectedPlan;
		[self.navigationController pushViewController:dvController animated:YES];
		[dvController release];
		dvController = nil;

Kann mir bei meinem Problem vielleicht wer helfen? Meine App hat schon stark Gestalt angenommen, aber solche (grundlegenden) Sachen verhindern einfach eine Fertigstellung.

Beste Grüße aus einem schön warmen Büro im 6. Stock
 
Hi,

ich kann dir leider nicht sagen wie das genau beim iPhone SDK geht, da ich mich auch erst seit zwei Tagen mit diesem befasse, aber in fast allen anderen Sprachen musst du eine globale Variable definieren und diese mit einem EventListener bzw. ChangeEvent koppeln...

Dann ändert sich die Variable in der Main schon bevor du die View geschlossen hast... Wird dir wohl im konkreten Fall nicht weiterhelfen, aber nur mal so vom Grundsatz her...

Gruß Ole!
 
So wie ich das jetzt schnell beim Durchlesen verstanden habe willst du die vom Server erhaltenden Daten aus dem ModalViewController in den sagen wir mal RootViewController laden.

Dazu legst du eine Variable, sagen wir einen NSString * userIDFromServer; im ModalViewController an.
property und synthesize nicht vergessen

Nun, jetzt in die .m Datei des RootView wechseln dann einen Präprozessor anlegen also #import "LoginViewController.h"

Dann in der entsprechenden Zeile, sagen wir in der Methode -viewDidLoad LoginViewController* controller = [blblba ich hoffe du weißt was du hier schreiben musst ;) ]; dann eine neuen String anlegen NSString* userIDCopiedFromLogin = controller.userIDFromServer;

Ich denke soweit kann man dir erstmal helfen
 
Hi,

ich mache es immer so:

Zuerst definierst du ein Protokoll in deinem LoginViewController:
Code:
@protocol LoginViewControllerDelegate
- (void)loginWasSuccessfulWithID:(NSString*) id;
@end
Außerdem brauchst du noch eine Ivar in der du den Delegate speicherst:

Code:
@interface LoginViewController : WasAuchImmer {
    id <FilterViewControllerDelegate> delegate;
    [...]
}
@property (nonatomic, assign) id <LoginViewControllerDelegate> delegate;
Beim erstellen des LoginViewControllers setzt du dann den Delegate auf den RootVC:
Code:
LoginViewController *modalController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil];
modalController.delegate = self;
[self presentModalViewController:modalController animated:YES];
[modalController release]
Wenn du jetzt im modalVC die Werte zurück geben willst machst du folgendes:

Code:
[delegate loginWasSuccessfulWithID:@"abc123"];
Im RootVC musst du das von dir festgelegte Protokoll dann impelementieren. D.h. im header einmal <LoginViewControllerDelegate> hinter den Klassennamen und dann die Methode implementieren.

Wenn jemand eine einfachere und genau so "saubere" Möglichkeit kennt, immer her damit. :-)
 
Zuletzt bearbeitet: