微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

在第一个 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 注入数据,而是在更新实例之间共享控制器实例。当控制器进入屏幕时,可以检查它需要的值并呈现。

关于您的解决方案:

// 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。