Создание делегатов
Начните с создания делегатов для обоих ваших контейнерных ViewControllers.Не забудьте добавить : class
.Если вы этого не сделаете, вы не сможете создать слабую переменную делегата:
protocol TopViewControllerDelegate: class {
func sendMessage(_ string: String)
}
protocol BottomViewControllerDelegate: class {
func sendMessage(_ string: String)
}
Теперь для каждого контейнера ViewController создайте слабую переменную делегата
class TopViewController: UIViewController {
weak var delegate: TopViewControllerDelegate?
...
}
class BottomViewController: UIViewController {
weak var delegate: BottomViewControllerDelegate?
...
}
затем для TopVC реализуйте делегат Bottom и для BottomVC Top.
extension TopViewController: BottomViewControllerDelegate {
func sendMessage(_ string: String) {
// do something
}
}
extension BottomViewController: TopViewControllerDelegate {
func sendMessage(_ string: String) {
// do something
}
}
Назначение делегатов
Ваши переходы между основным ViewController и контейнерами должны иметь свои собственные идентификаторы:EmbedTop
, EmbedBottom
.
Итак, в вашем WrapperViewController
создайте переменную для вашего Top и Bottom ViewController и переопределите метод prepare(for:sender:)
и внутри присвойте эти переменные
class WrapperViewController: UIViewController {
var topVC: TopViewController?
var bottomVC: BottomViewController?
...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "EmbedTop" {
topVC = segue.destination as! TopViewController
} else if segue.identifier == "EmbedBottom" {
bottomVC = segue.destination as! BottomViewController
}
}
}
, наконец, в viewDidAppear
установите делегат TopVC какBottomVC и BottomVC как TopVC
override func viewDidAppear(_ animated: Bool) {
topVC.delegate = bottomVC
bottomVC.delegate = topVC
}
Теперь два ваших ViewController могут общаться друг с другом!: -)
Пример:
class BottomViewController: UIViewController {
...
func speakToTop() {
delegate?.sendMessage("Hi Top!")
}
}