Доступ к методам, действиям и / или выходам с других контроллеров с помощью swift

Я работаю над проектом MacOS, где у меня есть разделенное представление, содержащее 2 других ViewController, и я не могу понять, как получить доступ к ViewControllers из ViewController моего основного окна.

это настройка:

скриншот раскадровки

В основном то, что я пытаюсь сделать, это использовать Button в моем ViewController в верхнем левом углу для доступа к Label в моем SectionController справа, который встроен в мой разделенный вид.

Так как я не могу создать IBAction или же IBOutlet для элемента управления в другом ViewController я не могу понять, как их подключить. Мой текущий обходной путь состоял в том, чтобы иметь собственность на моем AppDelegate и затем получить доступ к основному делегату общего приложения, но это кажется хакерским и не масштабируется. Я полностью потерян, что делать дальше. Я в порядке с использованием функции для передачи данных или чего-либо другого ViewController (ов).

Я использую Swift 4 с Xcode 9 (бета).

Есть идеи?

1 ответ

Решение

Конечно, вы не можете создать IBAction или IBOutlet для элемента управления в другом ViewController! Но просто каждый контроллер представления в иерархии имеет ссылку на свои дочерние контроллеры представления.

Способ 1:

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

Способ 2:

Возможно, было бы лучше, если бы вы использовали ссылку для каждого дочернего контроллера в своем методе "подготовка к переходу"

ContainerViewController:

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

YourSplitViewController:

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
    }
}

Таким образом, вы можете получить к нему доступ в своем контроллере вида контейнера:

@IBAction func buttonTapped(_ sender: Any) {
    self.mySplitViewController.firstViewController.label.text = "Whatever!"
}
Другие вопросы по тегам