web-dev-qa-db-de.com

Wie übergebe ich Daten von meinem ViewController an eine Containeransicht?

Ich habe ein Storyboard in XCode eingerichtet und habe einen MainViewController. Im MainViewController habe ich einen ContainerView hinzugefügt, der natürlich mit einem anderen VIewController einen Segue erzeugt.

In meiner MainViewController.m-Datei habe ich Daten eingerichtet und möchte diese Daten mit einem Etikett in der ContainerView verknüpfen. Ich dachte jedoch, ich könnte auf den Eigentümer der Datei klicken und dies tun, kann dies aber natürlich nicht, da es sich jetzt um zwei verschiedene Viewcontroller handelt .

Kann mir bitte jemand helfen, weil ich damit zu kämpfen habe? Es muss einen einfachen Weg geben, aber ich kann ihn nicht knacken!

Vielen Dank

21
Omar

Sie können prepareForSegue wie zwei andere Controller verwenden. Diese Methode wird aufgerufen, nachdem die beiden Controller instanziiert wurden, aber bevor viewDidLoad ausgeführt wird. Die andere Möglichkeit besteht darin, die childViewControllers-Eigenschaft des übergeordneten Controllers zu verwenden (der eingebettete Controller ist ein untergeordneter Controller). Das Kind wird also self.childViewControllers [0].

Nach der Bearbeitung:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"EmbedSegue"]) {
        MyEmbeddedController *embed = segue.destinationViewController;
        embed.labelString = self.stringToPass;
    }
}

Natürlich müssen Sie die Namen in das ändern, was Sie haben. Stellen Sie sicher, dass der Name, den Sie dem Segment in IB geben, mit dem Namen übereinstimmt, den Sie in der if-Anweisung überprüfen. In diesem Beispiel ist labelString eine Zeichenfolgeeigenschaft, die Sie in Ihrem eingebetteten Controller eingerichtet haben. In der viewDidLoad-Methode dieses Controllers können Sie dann den Wert des Labels mit dieser Zeichenfolge festlegen.

27
rdelmar

Dies ist so ziemlich die gleiche Antwort wie die von rdelmar nur in Swift.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let embeddedVC = segue.destinationViewController as? MyEmbeddedController where segue.identifier == "EmbedSegue" {
        embeddedVC.labelString = self.stringToPass
    }
}

"EmbedSegue" muss die im Interface Builder festgelegte Segmentkennung haben.

5
orkoden
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Make sure your segue name in storyboard is the same as this line
    if ([[segue identifier] isEqualToString:@"YOUR_SEGUE_NAME_HERE"])
    {
        // Get reference to the destination view controller
        YourViewController *vc = [segue destinationViewController];

        // Pass any objects to the view controller here, like...
        [vc setMyObjectHere:object];
    }
}

Ich sollte auch erwähnen, dass prepareForSegue ausgelöst wird, wenn Sie die Containeransicht verwenden, wenn Sie die ViewController angeben, die den Container enthält. 

0
Segev

Antwort für Swift 4:

if let controller = segue.destinationController as? MyEmbeddedController, segue.identifier!.rawValue == "EmbedSegue" {
    controller.labelString = self.stringToPass
}
0
David Boyd