Доступ к методам, действиям и / или выходам с других контроллеров с помощью 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!"
}