如何在嵌入导航堆栈的视图控制器中传递变量数据?
How to pass variable data in view controllers embedded in a navigation stack?
目前,我的导航堆栈中有三个视图控制器。
在第一个 VC 中,我使用选择器视图选择时间,然后使用按钮传递“pickedTime var”并转至第二个 VC。在第二个 VC 中,我成功地使用“pickedTime var”在屏幕上显示了选择的时间。
在我尝试将“pickedTime var”再次传递给第三个 VC 后,我 运行 遇到了问题。尽管加载了第三个屏幕,但“pickedTime var”在屏幕上显示 0 而不是 pickedTime。
第一个VC代码:
// 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 注入数据,而是在更新实例之间共享一个 Controller 实例。当控制器进入屏幕时,可以检查它需要的值并呈现。
关于您的解决方案:
// 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 的新控制器,您可以在其中保存选择的时间并且不需要保存任何变量,而是将整个对象作为依赖项传递。
还请记住,您正在创建一个依赖链,但通常会失败,因为 'var pickedTime: Int()' 将首先显示 0
目前,我的导航堆栈中有三个视图控制器。
在第一个 VC 中,我使用选择器视图选择时间,然后使用按钮传递“pickedTime var”并转至第二个 VC。在第二个 VC 中,我成功地使用“pickedTime var”在屏幕上显示了选择的时间。
在我尝试将“pickedTime var”再次传递给第三个 VC 后,我 运行 遇到了问题。尽管加载了第三个屏幕,但“pickedTime var”在屏幕上显示 0 而不是 pickedTime。
第一个VC代码:
// 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 注入数据,而是在更新实例之间共享一个 Controller 实例。当控制器进入屏幕时,可以检查它需要的值并呈现。
关于您的解决方案:
// 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 的新控制器,您可以在其中保存选择的时间并且不需要保存任何变量,而是将整个对象作为依赖项传递。 还请记住,您正在创建一个依赖链,但通常会失败,因为 'var pickedTime: Int()' 将首先显示 0