【问题标题】:How to pass variable data in view controllers embedded in a navigation stack?如何在嵌入导航堆栈的视图控制器中传递变量数据?
【发布时间】:2021-05-13 19:00:21
【问题描述】:

目前,我的导航堆栈中有三个视图控制器。

在第一个 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
}

【问题讨论】:

  • 两个想法。首先,你确定controller.pickedTime = pickedTime 被执行了吗?更多,你为什么在任何 ZVC 中使用 var pickedTime: Int() - 意思是两者 - 当你实际提供/传递它时?

标签: ios swift uinavigationcontroller uistoryboardsegue


【解决方案1】:

您可能不需要向 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 的新控制器,您可以在其中保存选择的时间,并且不需要保存任何变量,而是将整个 Object 作为依赖项传递。 还要记住,您正在创建一个最经常失败的依赖链,因为 'var pickTime: Int()' 将首先显示 0

【讨论】:

  • 感谢您指出我传递所选时间数据的方式的依赖链问题。你的建议很有效!
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 2015-03-12
  • 2015-05-17
  • 1970-01-01
  • 2012-05-04
相关资源
最近更新 更多