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
È 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.
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:
E ora tutto dovrebbe funzionare. Spero possa aiutare!
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
).
Prep forForSegue è una funzione sovrascritta da qualcos'altro? – FlaqueDeau
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