К сожалению, я не знаю, как работает перетаскивание в XCode, я делаю все в коде.Однако, когда ваш родительский контроллер представления создает другой контроллер представления, просто установите родительский объект в качестве делегата контейнера.
Создайте протокол:
protocol SomeProtocol: AnyObject {
func passX(a: String?)
func passY(b: String?)
}
И контейнеры будут иметь делегаты типа этого протокола:
class FirstContainerVC: UIViewController {
weak var delegate: SomeProtocol?
}
class SecondContainerVC: UIViewController {
weak var delegate: SomeProtocol?
}
Родитель должен соответствовать протоколу, чтобы он мог стать делегатом.Затем, когда вы создаете экземпляры контейнеров (что вы должны сделать только один раз в этом сценарии), установите self
в качестве их делегатов:
class ParentViewController: UIViewController, SomeProtocol {
// make the containers instance properties so that you
// can access them from the protocol methods
weak var firstContainerVC = FirstContainerVC()
weak var secondContainerVC = SecondContainerVC()
// set the delegates at some point
func setDelegates() {
firstContainerVC?.delegate = self
secondContainerVC?.delegate = self
}
func passX(a: String?) {
guard let a = a else {
return
}
secondContainerVC?.getFromFirst(a: a)
}
func passY(b: String?) {
//
}
}
Затем, когда вы хотите перейти от первого к второму, пройдите делегатиз первого контейнера в родительский и из родительского во второй контейнер.
class FirstContainerVC: UIViewController {
weak var delegate: SomeProtocol?
func sendToSecond() {
delegate?.passX(a: "slick")
}
}
class SecondContainerVC: UIViewController {
weak var delegate: SomeProtocol?
func getFromFirst(a: String) {
print(a)
}
}
Это несколько грубый пример.Вы должны написать свою реализацию так, как вы чувствуете себя наиболее комфортно (например, изящное развертывание, как / где вы создаете экземпляр и т. Д.).Кроме того, если все контроллеры представлений являются постоянными контроллерами представлений (это означает, что они никогда не освобождаются), нет необходимости делать их weak var
.Как бы вы ни делали, концепции все одинаковы.Родитель является делегатом для контейнеров, и контейнеры взаимодействуют друг с другом через родителя.
Некоторые люди могут предложить использовать наблюдателей уведомлений или одиночные сообщения для контейнеров, чтобы общаться друг с другом, но я считаю, что этоизлишним, когда у вас есть родитель прямо там.