问题描述
目前,我的导航堆栈中有三个视图控制器。
在第一个 VC 中,我使用选择器视图选择时间,然后使用按钮将“pickedTime var”传递给第二个 VC。在第二个 VC 中,我成功地使用了“pickedTime var”在屏幕上显示了选择的时间。
在我尝试将“pickedTime var”再次传递给第三个 VC 后,我遇到了一个问题。虽然加载了第三个屏幕,但“pickedTime var”在屏幕上显示的是 0 而不是pickedTime。
// Holds pickedTime from UIPickerView
var pickedTime = Int()
// Segue to second screen
override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
if segue.identifier == "showSecondScreen" {
let controller = segue.destination as! SecondViewController
controller.pickedTime = pickedTime
}
}
第二个 VC 代码:
// Holds pickedTime passed from first VC
var pickedTime: Int()
// Show pickedTime in label
override func viewDidLoad() {
super.viewDidLoad()
pickedTimeLabel.text = "\(pickedTime)" // shows 60
}
// Segue to pop-up screen or third screen
override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
if segue.identifier == "seguetoPopUp" {
let controller = segue.destination as! PopUpViewController
...
} else if let controller = segue.destination as? ThirdViewController {
controller.pickedTime = pickedTime
}
}
第三个 VC 代码
// Holds pickedTime passed from second VC
var pickedTime: Int()
// Show pickedTime in label
override func viewDidLoad() {
super.viewDidLoad()
pickedTimeLabel.text = "\(pickedTime)" // shows 0
}
解决方法
您可能不需要向 VC 注入数据,而是在更新实例之间共享控制器实例。当控制器进入屏幕时,可以检查它需要的值并呈现。
关于您的解决方案:
// Holds pickedTime passed from second VC
var pickedTime: Int()
// Show pickedTime in label
override func viewDidLoad() {
super.viewDidLoad()
pickedTimeLabel.text = "\(pickedTime)" // shows 0
}
取而代之的是,您可以创建一个名为 Time.swift 的新控制器,您可以在其中保存选择的时间,并且不需要保存任何变量,而是将整个对象作为依赖项传递。 还要记住,您正在创建一个依赖链,这些依赖链通常会失败,因为 'varpickTime: Int()' 将首先显示 0