Hallo Zusammen,
in Foren wird oft die Frage gestellt wie man denn eigentlich eine „Variable zwischen Klassen übergeben“ kann. Grund genug sich dem Thema einmal in einem Blogpost zu widmen. In dem Tutorial erstellen wir eine Mini-App, um zu zeigen wie man eine Variable übergibt.
Zunächst muss man jedoch festhalten, dass in der Frage bereits ein Fehler steckt. Variablen können nicht zwischen zwei Klassen übergeben werden. Klassen sind eine Art Bauplan für Objekte. Deshalb übergibt man eine Variable zwischen zwei Objekten (nach dem Bauplan von Klassen).
In der App wird man in einem ViewController Werte in ein Textfeld eingeben können, welche dann in einem zweiten ViewController angezeigt werden.
Starten wir mit einem frischen „Single View Application“ Projekt. Über File > New File erstellen wir eine neue Klasse „ViewController2“ als Subklasse von UIViewController. Im Header von ViewController2 ergänzen wir ein property
@property (strong, nonatomic) NSString *stringFromTextField;
Anschließend wechseln wir in das Storyboard und ziehen einen zweiten UIViewController zu dem bereits vorhandenen. Anschließend werden beide ViewController über Editor > Embed In > Navigation Controller in je einen Navigation Controller eingebettet. So ähnlich müsste es jetzt aussehen:
In den ersten ViewController ziehen wir nun ein UITextfield und einen UIButton. Der Button wird markiert und bei gedrückter ctrl Taste auf den unteren Navigation Controller gezogen. Im erscheinenden PopUp wählen wir „present modally“. Wir haben eine sogenannte Segue erzeugt. Der können wir im Identity Inspector noch einen Namen geben, z.B. „ToDetail“.
Wir müssen nun das UITextfeld aus dem Storyboard in der Klasse bekannt machen. Dazu nutzen wir den Assistent Editor und zieht das Textfeld mit gedrückter ctrl Taste in den ViewController.h. Wenn alle richtig gemacht wurde erscheint nun eine Zeile die so heißen könnte: @property (strong, nonatomic) IBOutlet UITextField *inputTextfield;
Wir müssen nun nur noch definieren, dass der untere ViewController von der Klasse ViewController2 (haben wir oben angelegt) sein soll. Das können wir im Identity Inspector festlegen.
Soviel zur Vorarbeit :-)
Jetzt können wir in den ViewController.m wechseln und eine neue Methode prepareForSegue schreiben.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"ToDetail"]) { UINavigationController *navigationController = segue.destinationViewController; ViewController2 *viewController2 = [[navigationController viewControllers] objectAtIndex:0]; viewController2.stringFromTextField = self.inputTextfield.text; } }
PrepareForSegue wird immer aufgerufen bevor eine Segue ausgeführt wird ( zur Erinnerung – unsere Segue hängt an dem Button aus dem Storyboard). Wir testen anschließend auf den Namen der Segue. Da wir hier nur eine haben, müssten wir das nicht. Aber es ist guter Stil und den kann man sich ruhig angewöhnen. Die Segue endet an einem UINaviagationController. Über Segue.destinationViewController finden wir diese Referenz und können uns dann zum ViewController2 weitersangen. Zu guter letzt übergeben wir den Wert.
Wir wechseln in ViewController2.m und ergänzen viewDidLoad.
- (void)viewDidLoad { [super viewDidLoad]; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(self.view.frame.size.width*0.1, self.view.frame.size.height*0.3, self.view.frame.size.width*0.8, 120)]; label.text = self.stringFromTextField; [self.view addSubview:label]; }
Nichts spannendes hier. Wir erstellen ein UILabel und füllen es mit dem übergebenen Wert. Natürlich hätte man das Label auch im Storyboard einfügen können.
Das ist schon alles. Der Wert aus dem Textfeld wird übergeben und im ViewController2 angezeigt.
Viel Spaß.