【问题标题】:Unable to pass a value from the child VC to the parent VC using protocol/delegate无法使用协议/委托将值从子 VC 传递到父 VC
【发布时间】: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


【解决方案1】:

我正在使用addChild(viewController)viewController.didMove(toParent: self) 将子VC 添加到父VC。

这就是问题所在。没有转场。您正在以编程方式呈现子 VC。

您应该将代理设置在与您呈现子 VC 相同的位置。我猜你有这样的代码:

let viewController = ChildVC(...)
addChild(viewController)
viewController.didMove(toParent: self)

在上述几行之后设置委托:

viewController.delegate = self

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多