На мой взгляд, у вас есть 2 достойных варианта использования шаблона делегата. 1 ужасный вариант, который будет работать, но он хакерский и ленивый, и тогда у вас есть шаблон приемника вещания.
2 достойных варианта
1 - передать делегата вперед
class VC1: UIViewController, SomeDelegate {
func delegateFunction() {}
func showNextVC() {
let next = VC2()
next.forwardingDelegate = self
present(next, animated: true)
}
}
class VC2: UIViewController {
var forwardingDelegate: SomeDelegate? = nil
func showNextVC() {
let next = VC3()
next.delegate = forwardingDelegate
present(next, animated: true)
}
}
2 - передать 3-го контроллера второму контроллеру
class VC1: UIViewController, SomeDelegate {
func delegateFunction() {}
func showNextVC() {
let final = VC3()
final.delegate = self
let next = VC2(withControllerToPresent: final)
present(next, animated: true)
}
}
class VC2: UIViewController {
let controller: UIViewController
init(withControllerToPresent controller: UIViewController) {
self.controller = controller
super.init(withNibName: nil, bundle: nil
}
func showNextVC() {
present(controller, animated: true)
}
}
class VC3: UIViewController {
var delegate: SomeDelegate? = nil
}
1 Ужасный вариант
Использовать единую / глобальную переменную .... (пожалуйста, не надо)
Личное мнение
Я сделал оба первых двух варианта ... Они Работа. Но шаблон приемника вещания, вероятно, лучше, потому что он будет чище. VC2 не нужно пересылать что-либо на 3. Просто убедитесь, что пространство имен вашего уведомления указано c достаточно, чтобы потом его не перехватить.