之前我已将数据发送到其他ViewControllers,但无法弄清楚为什么这种情况不起作用。情况如下
在我们以编程方式推送SecondViewController之前,我的FirstViewController将需要发送到SecondViewController的一些数据。这是通过以下方式完成的:
@IBAction func someButtonPressed(_ sender: UIButton) {
let storyBoard = UIStoryboard(name: "SecondStoryBoard", bundle: nil)
if let secondViewController = storyBoard.instantiateInitialViewController() as? ResultsViewController {
secondViewController.var1 = self.var1
// Sanity check
print("set secondViewController.var1 to \(self.var1)") // Printed data as expected
self.navigationController?.pushViewController(secondViewController, animated: true)
}
}
我的SecondViewController将测试数据是否在其ViewDidLoad中正确设置。这是通过以下方式完成的:
override func viewDidLoad() {
super.viewDidLoad()
if let var1 = self.var1 {
print("SUCCESS: var1 was set!")
} else {
print("FAILURE: var1 is nil! Crash imminent") // Printed here, hence my problem
}
}
在SecondViewController中为var1创建getter和setter,并观察它们何时被设置/获取。该变量由FirstViewController中的someButtonPressed设置在适当的行,但是当if let var1 = self.var1在FirstViewController中调用getter时,该值为nil。
在SecondViewController中的var1上放置断点。我看到变量初始化为nil,因为它是一个可选的集合,后来又设置为nil(再次没有再次调用setter)
答案 0 :(得分:0)
问题在于SecondViewController的View的以下屏幕截图。
(注意:让ResultsViewController = SecondViewController)
从图中可以看出,这不是标准的简单视图,您可以在指南中找到如何将数据从一个ViewController传递到另一个ViewController的视图。我的问题在于我们有一个View嵌入另一个视图。我没有意识到,即使它在Xcode的界面构建器中列出,嵌入也是一种segues。
当将数据传递给SecondViewController时,我忽略了嵌入内部视图的外部视图。两个视图都将其自定义类设置为SecondViewController,但这只是掩盖了上述断点情况的问题。
发生的事情是,我实例化了外部视图,成功地将数据设置为SecondViewController,然后它转向其内部视图,并且所述内部视图的SecondViewController将具有默认值零值。
为了解决这个问题,我写了一个
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if(segue.identifier == "secondViewController") {
if let secondViewController = segue.destination as? SecondViewController {
secondViewController.var1 = self.var1
}
}
}
在SecondViewController中,这样当外部视图向内部移动时,它就会传递其数据。
我也可能应该同时拥有内部和外部视图,以便单独使用ViewControllers以避免混淆。