2015-04-11 10 views
28

Ich habe eine Containeransicht, die ich in mein Storyboard geschrieben habe. Es gibt einen wundervollen kleinen Pfeil, der den eingebetteten Übergang zu einer anderen Szene darstellt. Das oberste Objekt dieser Szene wird von einer benutzerdefinierten UIViewController gesteuert. Ich möchte eine Methode aufrufen, die in meiner benutzerdefinierten Klasse implementiert ist. Wenn ich Zugriff auf den Container habe, wie bekomme ich einen Hinweis darauf, was drin ist?Wie bekomme ich die Ansichten in einem Container in Swift?

Antwort

70

Sie prepareForSegue, ein Verfahren, in UIViewController verwenden können, um von der aktuellen View-Controller Zugriff auf alle UIViewController wird segued zu gewinnen, gehören diese embed segues.

Aus der Dokumentation über prepareForSegue:

Die Standardimplementierung dieser Methode keine Auswirkungen. Ihr View-Controller überschreibt diese Methode, wenn relevante Daten an den neuen View-Controller übergeben werden müssen. Das Objekt "segue" beschreibt den Übergang und enthält Verweise auf beide Ansichtscontroller, die am Übergang beteiligt sind.

In Ihrer Frage erwähnten Sie, dass Sie eine Methode auf Ihrem benutzerdefinierten Ansichtscontroller aufrufen müssen. Hier ist ein Beispiel, wie Sie das tun könnten:

1. Geben Sie Ihrem Embedded-Segue eine Kennung. Sie können dies im Interface Builder tun, indem Sie Ihr Segment auswählen, zum Attributeditor gehen und unter suchen. Storyboard Embed Segue.

enter image description here

2. Erstellen Sie Ihre Klassen so etwas wie:

Ein Verweis auf embeddedViewController so myMethod gehalten wird, kann später aufgerufen werden. Es wird deklariert, dass es sich um ein implizit unwrapped optionales Element handelt, da es keinen Sinn ergibt, ihm einen Nicht-Null-Anfangswert zu geben.

// 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. die Klassen Ihrer UIViewControllers in IB Set die Identität Inspektor. Zum Beispiel:

enter image description here

Und sollte nun alles funktionieren. Ich hoffe, das hilft!

+0

Ist prepareForSegue eine übergeordnete Funktion von etwas anderem? – FlaqueDeau

+0

Das funktionierte großartig, aber ich bemerkte, dass ich das 'where segue.identifier ==" EmbedSegue "-Bit nicht brauchte, du würdest wahrscheinlich brauchen, dass wenn du mehrere Embedded-Controller hast, aber mit nur dem einen, sieht es so aus brauche den Bezeichner nicht. – TaylorAllred

10

ABakers Antwort gibt dem Elternteil eine gute Möglichkeit, etwas über das Kind zu erfahren. Verwenden Sie self.parent (oder ObjC, parentViewController) für Code in dem Kind, um das Eltern zu erreichen.