如何在嵌入导航堆栈的视图控制器中传递变量数据?

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