Swift中Segue跳转后,被调用VC无法访问调用方数组的问题
解决第二个VC无法访问主VC
listArray 的问题 这个报错的原因很明确:你在第二个VC里把 masterView 声明成了通用的 UIViewController 类型,而你的主VC是一个自定义的UIViewController子类(比如叫 MainViewController 之类的),listArray 是这个子类特有的属性,编译器不知道 masterView 其实是你的主VC实例,所以会提示找不到 listArray 成员。
快速修复当前方案
只需要修改第二个VC里 masterView 的类型声明,把它改成你主VC的具体类名就行:
// 把原来的 UIViewController 替换成你的主VC类名,比如 MainViewController var masterView: MainViewController!
这样编译器就能识别到 masterView 拥有 listArray 属性,viewWillDisappear 里的赋值代码就不会报错了。
更优雅的替代方案(推荐)
直接持有主VC的引用可能会带来循环引用的风险(两个VC互相持有对方,导致内存无法释放),更推荐用闭包回调的方式传递数据,这也是iOS开发中常用的反向传值方式:
- 在第二个VC(
SaveViewController)里定义一个闭包属性:
// 这里的 [YourElementType] 替换成你数组实际的元素类型,比如 [String] var updateArrayHandler: (([YourElementType]) -> Void)?
- 在第二个VC需要返回数据的时机(比如
viewWillDisappear)调用这个闭包:
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // 把更新后的 listArray 通过闭包传递回去 updateArrayHandler?(listArray) }
- 在主VC的
prepare(for:sender:)方法里设置闭包,并传递初始数组:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let toViewController = segue.destination as! SaveViewController // 把主VC的 listArray 传给第二个VC toViewController.listArray = self.listArray // 设置闭包,接收更新后的数组 toViewController.updateArrayHandler = { updatedArray in self.listArray = updatedArray } }
这种方式不需要让第二个VC持有主VC的引用,避免了循环引用问题,代码也更解耦。
内容的提问来源于stack exchange,提问作者user6802867
相关产品推荐
相关产品推荐

