2013-07-20 9 views
20

Ho uno storyboard impostato in XCode e un MainViewController. Nel MainViewController ho aggiunto un ContainerView che crea naturalmente un Segue con un altro VIewController.Come posso passare i dati dal mio ViewController a una vista container?

Nel mio file MainViewController.m ho impostato i dati e voglio collegare questi dati a un'etichetta nel ContainerView, tuttavia ho pensato che avrei potuto fare clic sul proprietario del file e farlo ma, naturalmente, non posso perché sono 2 diversi viewcontrollers ora.

Qualcuno può aiutarmi perché sono alle prese con questo. Ci deve essere un modo semplice ma non posso romperlo!

Grazie

risposta

24

È possibile utilizzare prepareForSegue proprio come qualsiasi altro due controller - che il metodo sarà chiamato dopo che i due controller sono istanziati, ma prima che uno viewDidLoad corre. L'altro modo per farlo consiste nell'utilizzare la proprietà childViewControllers del controllore parent (il controller incorporato è un figlio). Quindi, il bambino sarà auto.childViewControllers [0].

Dopo Edit:

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

Naturalmente, è necessario cambiare i nomi per quello che hai. Assicurati che il nome che dai ai passaggi in IB corrisponda a quello che controlli nella dichiarazione if. In questo esempio labelString è una proprietà stringa impostata nel controller incorporato. Quindi, nel metodo viewDidLoad di quel controller, puoi impostare il valore dell'etichetta con quella stringa.

+0

io non capisco. Sono abbastanza nuovo per questo, quindi se saresti così gentile da fornire qualche esempio di codice, sarebbe davvero utile. – Omar

+0

@ Omar, ho modificato la mia risposta con il codice. – rdelmar

+0

Grazie per quello. Così ora il mio codice simile a questa: - (void) prepareForSegue: (UIStoryboardSegue *) segue mittente: (id) sender { if ([[identificatore segue] isEqualToString: @ "MainChild"]) { MainViewController * embed = segue.destinationViewController; embed.labelNextPrayer = self.labelNextPrayer; }} Tuttavia quell'etichetta che io chiamo io ancora non può collegare a qualsiasi cosa nel ContainerView che si chiama 'View Controller' – Omar

0
- (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]; 
    } 
} 

Vorrei anche ricordare che, poiché si utilizza una vista Container, sarà attivato prepareForSegue quando si presenti la ViewController che tiene il contenitore.

+0

Grazie mille. Sono solo un po 'confuso riguardo al' [vc setMyObjectHere: object]; ' sezione. Ho un intero mucchio di codice nel metodo ViewDidLoad con le prese che vengono rilevate dal MainViewController. Voglio semplicemente essere in grado di collegare queste uscite agli elementi nella vista Contenitore (che è un controller di vista separato collegato con un Segue) – Omar

+0

Dovresti passare i dati nel codice sopra. Se le sue stringhe, creare una matrice di stringa e passare quella. Controlla la mia risposta qui sul trasferimento dei dati: http://stackoverflow.com/a/16670995/1578927 – Segev

5

Questa è più o meno la stessa risposta del one by rdelmar solo 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" deve l'identificatore segue impostato in Interface Builder.

0

risposta per Swift 4:

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