【发布时间】:2021-01-16 19:27:57
【问题描述】:
我目前有一个子 VC 添加到父 VC 的容器视图中,我正在尝试使用协议/委托将值从子 VC 传递给父 VC。
我先创建了协议:
protocol ChildToParentProtocol: AnyObject {
func passValueToParent(value: Bool)
}
然后,为父 VC 配备协议:
extension ParentVC: ChildToParentProtocol {
func passValueToParent(value: Bool) {
print(value)
}
}
在 IB 中创建了一个从父容器视图到子视图控制器的 segue,名为“childToParentSegue”。然后,将此添加到父 VC:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? ChildVC, segue.identifier == "childToParentSegue" {
vc.delegate = self
}
}
最后,将这个添加到子 VC 中:
weak var delegate: ChildToParentProtocol? = nil
@objc func buttonPressed(sender: UIButton!) {
delegate?.passValueToParent(value: true)
}
当我按下子 VC 中的按钮时,即使按钮正在工作,父 VC 也没有接收到值。
更新
我正在使用 addChild(viewController) 和 viewController.didMove(toParent: self) 将子 VC 添加到父 VC
【问题讨论】:
-
看起来不错!所以让我们尝试调试。在 buttonPressed 运行时,
delegate是 nil 吗?vc.delegate = self行真的运行了吗? -
顺便说一句,你并不需要一个让孩子与父母交谈的协议。实际上,该按钮可以使用 nil 目标操作直接调用父级。
-
delegate实际上是 nil 正如你提到的。这是否意味着 segue 设置不正确?我使用addChild(viewController)和viewController.didMove(toParent: self)将子VC 添加到父VC。另外,您能解释一下什么是无目标操作吗? -
我还设置了从父 VC 的容器视图到子 VC 的嵌入 segue。
-
好的,所以嵌入 segue 并使用 addChild(viewController) 和 viewController.didMove(toParent: self) 是相反的,只选择一个,segue 或代码。如果您使用代码,则在此处设置委托。
标签: ios swift uiviewcontroller delegates swift-protocols