[英]How Pass Data back a view controller in the stack?
我已经在这个类别中看到了很多问题,但是它们似乎都以相同的方式回答,这只是在视图控制器之间传递数据,这并不是我想要的。
我有在其中存储数据的VC1,在特定情况下,用户需要在VC2中获取全部信息。 我需要将该信息传递回VC1,称为数据“ info”
我希望使用的代码是这样的。 我访问VC堆栈,并将变量分配给可选的“ info”变量(在编译时,堆栈不知道VC类型是堆栈中的哪种类型。
let nav = self.navigationController
let nextView = nav?.viewControllers[(nav?.viewControllers.count)! - 1]
****//code that isn't working
nextView.info = self.info => Value of type 'UIViewController?' has no member 'info'
****//This works fine
nav?.popViewController(animated: true)
你需要投
if let let nextView = nav?.viewControllers[(nav?.viewControllers.count)! - 1] as? VCName {
nextView.info = self.info
}
假设您处于导航堆栈中,并且位于您下方的视图控制器就是您要与之交谈的视图控制器,这是脆弱的。
我的猜测是以前的视图控制器推动了您的工作,并为您提供了您正在编辑的数据。
在两个视图控制器之间设置一个委托协议,并在推送之前让自己成为新的视图控制器的委托,这样会更好/更清洁。 然后它将只向其委托发送一条消息以将数据传回。
nextView
被认为是它的超类UIViewController
因为UINavigationController
viewControllers
数组是这样定义的( [UIViewController]
)。
如果您的VC1是FirstVC
类型( UIViewController
子类),则应将其FirstVC
为它的实际类,以便“看到”您的其他属性。 下一个视图控制器也是如此。 那么,如果执行此操作会怎样?
let nextView = nav?.viewControllers[(nav?.viewControllers.count)! - 1] as? SecondVC
当然,假设您的nextView
是SecondVC
类。 请记住,面向对象的编程具有多态性 ,在这种情况下,所有视图控制器都是UIViewController
后代,因此,它们通常是UIViewController
在这种情况下可能会发生。
无论如何,正确的方法是定义一个协议,使FirstVC
符合该协议,将第一视图控制器作为参数传递给SecondVC
,然后在第二视图控制器中,当选择一个协议时,将协议方法返回给第一视图控制器。选项。 就像是:
protocol PassDataBackProtocol {
var result: String
}
class FirstVC: UIViewController, PassDataBackProtocol {
var result: String = "" {
didSet {
// Update your view
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let secondVC = segue.destination as? SecondVC {
secondVC.firstVC = self
}
}
}
class SecondVC: UIViewController {
weak var firstVC: PassDataBackProtocol?
func didChangeValue(newValue: String) {
firstVC?.result = newValue
navigationController?.popViewController(animated: true)
}
}
如果您使用的是pushViewController(_:animated:)
而不是segues, firstVC
在执行推送之前设置firstVC
。
编辑:我将weak
属性添加到后指针,因为避免保留子弹很重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.