要使协议和代理正常工作,视图控制器是否必须在堆栈中相邻? 我的委托人调用的函数运行良好,直到我在发送数据的vc和接收数据的vc之间插入了一个新的vc。 (如果答案是“当然,你这个白痴!”我真的很放心,因为我真的很沮丧。)
答案 0 :(得分:1)
大概你有这样的东西:
并且您的代码沿以下行运行:
protocol MyCustomDelegate: class {
func myFunc(_ value: Int)
}
class VC1: UIViewController, MyCustomDelegate {
func myFunc(_ value: Int) {
print("value: \(value)")
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? VC2 {
vc.delegate = self
}
}
}
class VC2: UIViewController {
weak var delegate: MyCustomDelegate?
func someAction(_ sender: Any?) -> Void {
delegate?.myFunc(1)
}
}
现在,您“插入新的VC” :
因此,您在VC1
中的代码不再与VC2
保持联系...因此将不会设置委托。
一种方法(不一定是最好的方法)是:
VC1A
中设置的VC1
中添加一个委托var VC1A
导航到VC2
时,将那个委托传递给它可能看起来像这样:
protocol MyCustomDelegate: class {
func myFunc(_ value: Int)
}
class VC1: UIViewController, MyCustomDelegate {
func myFunc(_ value: Int) {
print("value: \(value)")
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? VC1A {
vc.delegate = self
}
}
}
class VC1A: UIViewController {
weak var delegate: MyCustomDelegate?
func someAction(_ sender: Any?) -> Void {
delegate?.myFunc(1)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? VC1A {
vc.delegate = self.delegate
}
}
}
class VC2: UIViewController {
weak var delegate: MyCustomDelegate?
func someAction(_ sender: Any?) -> Void {
delegate?.myFunc(1)
}
}
如果您的应用程序流程足够简单,这可能会起作用...但是,这并不理想,并且随着代码变得越来越复杂,容易出现问题。
您可能想重新考虑代码的结构以及如何管理数据。