首页 > 解决方案 > 尝试在 2 个 VC 之间进行通信时,我在哪里定义闭包的行为?

问题描述

我有 2 个独立的视图控制器,并且正在使用闭包在它们之间进行通信。我想要在 VC 1 上按下一个按钮来更改 VC 2 的背景颜色。但是,使用以下代码按下按钮不会执行任何操作:

class VCOne: UIViewController {

    var delta: () -> Void = { }

    @objc func buttonPressed() {
       delta()
     }

 override func viewDidLoad() {
    super. viewDidLoad()

    let pageController = PageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal)
            addChild(pageController)
            pageController.didMove(toParent: self)
           pageContainerView.addSubview(pageController.view)



}


class VCTwo: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .white

    VCOne().delta = {
       view.backgroundColor = .red
          }
     }
}

现在,我相信我的错误是当我在 VCTwo() 的 viewDidLoad() 中再次初始化它时,我正在创建一个新的 VCOne 实例,但我无法以任何其他方式访问 VCTwo() 中的 delta()。

我该如何解决这个问题?

标签: swiftclosures

解决方案


假设您想使用闭包将字符串从 VC2 传递到 VC1,那么您可以按照以下步骤操作 -

  1. 在 VC2 中声明闭包变量为,

    var completionBlock: ((String) -> Void)?
    
  2. 从 VC2->VC1 返回时,
    在 VC2 中传递来自 completionBlock 的值。

    let stringToPass = "xyz"
    VC2.completionBlock = { stringToPass in
       if self.completionBlock != nil {
         self.completionBlock!(stringToPass)
       }
    }
    
  3. 从 VC1 推 VC2 时,设置

    VC2.completionBlock = { strGotFromVC2 in
      self.requiredValueFromVC2 = strGotFromVC2
    }
    

通过这种方式,您可以在 VC1 的 requiredValueFromVC2 变量中获取值,使用 Closure 从 VC2 传递


推荐阅读