2017-09-03 1 views
-1

Ich arbeite an einem MacOS-Projekt, wo ich eine geteilte Ansicht mit 2 anderen ViewControllern habe und nicht herausfinden kann, wie ich auf die ViewControllers von meinem primären Fenster aus zugreifen kann ViewController.Zugriff auf Methoden, Aktionen und/oder Ausgänge von anderen Controllern mit swift

dies ist das Setup:

screenshot of storyboard

Im Grunde, was ich versuche zu tun, um die Button in meinem ViewController auf der oberen linken Ecke nutzen die Label in meinem SectionController auf der rechten Seite zuzugreifen, die ist in meiner Split-Ansicht eingebettet.

Da ich kein IBAction oder IBOutlet für eine Steuerung in einem anderen ViewController erstellen kann, kann ich nicht herausfinden, wie man diese verbindet. Meine aktuelle Problemumgehung bestand darin, eine Eigenschaft auf meinem AppDelegate zu haben und dann auf den Delegierten der Hauptgemeinschaftsanwendung zuzugreifen, aber das fühlt sich hacky und wird nicht skalieren. Ich bin völlig verloren, wie es weitergeht. Ich bin in Ordnung mit einer Funktion, um Daten oder was auch immer zu den anderen ViewController (s) zu übergeben.

Ich verwende Swift 4 mit Xcode 9 (Beta).

Irgendwelche Ideen?

+0

"Da ich keine IBAction oder IBOutlet für ein Steuerelement in einem anderen Viewcontroller schaffen" Erstellen Sie für jede Aufteilung eine View-Controller-Unterklasse. Wenn Sie für Apple, Inc. arbeiten, fragen Sie dann Ihren Kollegen. –

+0

Jede Aufteilung hat bereits eine ViewController-Unterklasse und dort füge ich einige Funktionen/Aktionen/Eigenschaften hinzu, habe aber keine Möglichkeit, das von meiner Top-Level-Ansicht aus zu erreichen. Gibt es noch etwas, das mir fehlt? Re Apfel: Es ist eine große Firma, ich habe keine Entwickler, die in xcode/swift/cocoa in meiner Abteilung arbeiten. –

Antwort

1

Natürlich können Sie nicht IBAction oder IBOutlet für ein Steuerelement in einem anderen ViewController erstellen !! Aber einfach jeder View-Controller in der Hierarchie hat eine Referenz für seine Kind-View-Controller.

Methode 1:

@IBAction func buttonTapped(_ sender: Any) { 
    let splitViewController = self.childViewControllers[0] as! YourSplitViewController 
    let targetViewController = splitViewController.childViewControllers[0] as! YourTargetViewController 
    targetViewController.label.text = "Whatever!" 
} 

Methode 2:

Es kann besser sein, wenn Sie für jedes Kind Controller einen Verweis nehmen in Ihrer "Vorbereitung für Segue" Methode

ContainerViewController:

var mySplitViewController: YourSplitViewController? 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "splitViewSegue" { 
     self.mySplitViewController = segue.destination as! YourSplitViewController 
    } 
} 

YourSplitViewController: dass

var aViewController: YourFirstViewController? 
var bViewController: YourSecondViewController? 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "aViewSegue" { 
     self.aViewController = segue.destination as! YourFirstViewController 
    } else if segue.identifier == "bViewSegue" { 
     self.bViewController = segue.destination as! YourSecondViewController 
    } 
} 

So ist es Sie kann wie in Ihrem Container-View-Controller zugreifen:

@IBAction func buttonTapped(_ sender: Any) { 
    self.mySplitViewController.firstViewController.label.text = "Whatever!" 
} 
+0

Muss ich den NSSsplitViewController ableiten, um dies zu tun? Ich bemerkte, dass ich die Split-Ansicht in eine Container-Ansicht eingebettet hatte, dass sie in meiner Top-Level-Ansicht nicht als "childViewController" sichtbar war und in den unteren Ansichten nicht als "Eltern" sichtbar war. Ich denke, da ist etwas Kleines, das mir fehlt, wie ich das verkrafte. –

+0

ok, hantieren mit den Informationen, die du mir gegeben hast, ich denke, ich habe herausgefunden, was vor sich geht (ich habe mich noch nie mit Vorgängern beschäftigt). Ich werde versuchen, aber das hat mich auf den richtigen Weg gebracht. Vielen Dank! –

+0

für Methode 1 müssen Sie UISplitViewController nicht ableiten, Sie können es einfach durch childViewControllers Eigenschaft aufrufen –

Verwandte Themen