swift - 尝试在 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()。
我该如何解决这个问题?
解决方案
假设您想使用闭包将字符串从 VC2 传递到 VC1,那么您可以按照以下步骤操作 -
在 VC2 中声明闭包变量为,
var completionBlock: ((String) -> Void)?
从 VC2->VC1 返回时,
在 VC2 中传递来自 completionBlock 的值。let stringToPass = "xyz" VC2.completionBlock = { stringToPass in if self.completionBlock != nil { self.completionBlock!(stringToPass) } }
从 VC1 推 VC2 时,设置
VC2.completionBlock = { strGotFromVC2 in self.requiredValueFromVC2 = strGotFromVC2 }
通过这种方式,您可以在 VC1 的 requiredValueFromVC2 变量中获取值,使用 Closure 从 VC2 传递
推荐阅读
- sql - Postgres:从带有标题的 CSV 创建表
- angular - 如何根据变量的当前值验证输入(自定义验证器函数)?
- docker - 获取 Dockerfile 中的图像标签
- python - 在 ackermann 函数上获取 TypeError。不知道为什么
- c - 在 C 中读取并打印出 .dat 文件
- javascript - 将猫鼬对象传递给 puppeeter 的 evalute() 函数不起作用
- reactjs - (React、MaterialUI、Context)MUI 自动完成/TextField 未在挂载时呈现其值
- java - 更新 Firebase 时间戳值
- sorting - 在 Flutter 中对嵌套列表进行排序
- angular - 向模型添加反序列化接口会导致错误