2015-04-11 13 views
28

Ho una vista Contenitore che ho inserito nel mio storyboard. C'è una piccola e meravigliosa freccia che rappresenta i passaggi incorporati in un'altra scena. L'oggetto di livello superiore di quella scena è controllato da un numero personalizzato UIViewController. Voglio chiamare un metodo che è implementato nella mia classe personalizzata. Se ho accesso al contenitore, come faccio a ottenere un riferimento a cosa c'è dentro?Come ottengo le viste in un contenitore in Swift?

risposta

70

È possibile utilizzare prepareForSegue, un metodo in UIViewController, per ottenere l'accesso a qualsiasi UIViewController essere segued a dal controller visualizzazione corrente, questo include embed segues.

Dalla documentazione su prepareForSegue:

L'implementazione predefinita di questo metodo non fa nulla. Il controller della vista sovrascrive questo metodo quando è necessario passare i dati rilevanti al nuovo controller della vista. L'oggetto segue descrive la transizione e include riferimenti a entrambi i controller di vista coinvolti nel seguito.

Nella tua domanda hai menzionato la necessità di chiamare un metodo sul tuo controller di visualizzazione personalizzato. Ecco un esempio di come potresti farlo:

1. Dai al tuo embed segue un identificatore. Puoi farlo in Interface Builder selezionando il tuo seguito, passando all'Editor degli attributi e guardando sotto Storyboard. Inserisci segmento.

enter image description here

2. Crea il tuo classi qualcosa come:

viene mantenuto un riferimento a embeddedViewController così myMethod può essere chiamato in seguito. È dichiarato come facoltativo da scartare implicitamente perché non ha senso dargli un valore iniziale non zero.

// This is your custom view controller contained in `MainViewController`. 
class CustomViewController: UIViewController { 
    func myMethod() {} 
} 

class MainViewController: UIViewController { 
    private var embeddedViewController: CustomViewController! 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let vc = segue.destination as? CustomViewController, 
        segue.identifier == "EmbedSegue" { 
      self.embeddedViewController = vc 
     } 
    } 

    // Now in other methods you can reference `embeddedViewController`. 
    // For example: 
    override func viewDidAppear(animated: Bool) { 
     self.embeddedViewController.myMethod() 
    } 
} 

3. Impostare le classi del vostro UIViewControllers in IB utilizzando il Identity Inspector. Per esempio:

enter image description here

E ora tutto dovrebbe funzionare. Spero possa aiutare!

+0

Prep forForSegue è una funzione sovrascritta da qualcos'altro? – FlaqueDeau

+0

Questo ha funzionato bene, tuttavia ho notato che non ho bisogno del bit "where follows.identifier ==" EmbedSegue "', probabilmente avresti bisogno che se tu avessi più controller embedded, ma con solo uno, sembra che tu non ti 'ho bisogno dell'identificatore. – TaylorAllred

10

La risposta di ABaker è un ottimo modo per i genitori di conoscere il bambino. Per il codice nel bambino per raggiungere il genitore, utilizzare self.parent (o in ObjC, parentViewController).

Problemi correlati