Swift。将持久数据从一个视图控制器传递到另一个视图控制器并存储在标签数组中

Swift. Passing persistent data from one View Controller to another and storing within a label array

我正在使用 segue 从 View Controller 1 转到 View Controller 2。View Controller 1 有一个按钮,可以在单击时设置持久数据:

我为用户默认值声明一个全局变量:

   let userDefault = UserDefaults()

这是我的按钮,用于将用户默认值设置为带有来自标签的文本值的字符串:

 @IBAction func saving(_ sender: UIButton) {
    let savedText = "Gallon \(gallonTextFieldOutlet.text) is equal to Litre \(litreTextFieldOutlet.text) is equal to Pint \(pintTextFieldOutlet.text)"
    userDefault.setValue(savedText, forKey: "SavedConversion")
}

然后我获得对 View Controller 2 的引用,并在用户通过 segue 从 View Controller 1 转到 View Controller 2 时传递此用户默认值:

  // in view controller 2: reference to get persistent data
    var volumeDataOne:String?
   // in view controller 2: instantiation of my queue class to use methods
   var queue = Queue<String>()

   // segue action in view controller 1
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "savedVolumeData"
    {
       let historyVC:VolumeHistoryViewController = segue.destination as! VolumeHistoryViewController
        
        if let value = userDefault.value(forKey: "SavedConversion") as? String {
        historyVC.volumeDataOne = value
        }
    }

我在 View Controller 2 中得到了这个,我试图将它设置为我在这个 View Controller 中拥有的三个标签:

  func DisplayVolumeHistory() {
    
    let labelArray = [volumeDataLabelOutlet, volumeDataLabelTwoOutlet, volumeDataLabelThreeOutlet]

        if let bindingOptional = volumeDataOne
        {
            for index in 0..<labelArray.count
            {
            queue.enqueue(val: bindingOptional)
            labelArray[index]?.text = queue.arr[index]
            }
    }
}

在我的规范中,我被告知数据需要持久化,并且一次只能存储最后五个数据。所以我有一个 class ,我称之为 Queue ,它在这个函数中被引用。此函数在 View Controller 2 的 viewDidLoad 上被调用。

  override func viewDidLoad() {
    super.viewDidLoad()
    
    //Debug ...
    volumeDataLabelOutlet.text = "na"
    volumeDataLabelTwoOutlet.text = "na 2"
    volumeDataLabelThreeOutlet.text = "na 3"
    //...
    
    DisplayVolumeHistory()
    // Do any additional setup after loading the view.
}

我已经在 Playground 中测试了我的队列 class,它按预期工作。队列 class 可以在这里看到:

class 队列 {

var arr = [T]()

func enqueue(val: T){
    if(arr.count < 3) {
        arr.append(val)
    } else {
        for i in 0..<arr.count-1 {
            arr[i] = arr[i + 1]
        }
        arr[arr.count - 1] = val
    }
}

func dequeue() -> (T?){
    if (arr.isEmpty){
        return nil
    } else {
        return arr.remove(at: 0)
    }
}
}

这是我似乎无法弄清楚的问题。在 View Controller 2 中,所有三个标签都将具有持久数据,但它们都是相同的数据,

比如我有如下数据:

DATA 1: 555
DATA 2: 700
DATA 3: 62

我想要:

LABEL 1 --> 555
LABEL 2 --> 700
LABEL 3 --> 62

但是,目前它将是:

LABEL 1 --> 62
LABEL 2 --> 62
LABEL 3 --> 62

我不确定为什么要调试。我相信这是因为我在 View Controller 1 中的持久数据只采用一个字符串,当我使用相同的键时字典将覆盖它。

但是,我查看了文档并尝试使用用户默认数组并没有解决我的问题,我不确定是什么导致了这个问题。

感谢任何指导和帮助来解决这个问题。

谢谢

你的评论是对的,

which the Dictionary is overriding as I use the same key

每次点击该按钮时,都会用新值覆盖该值。所以你应该总是看到你的 v2,最后一个。

所以您可能应该存储数组而不是字符串。

    //on v1
    var values = [String]()

    @IBAction func saving(_ sender: UIButton) {
        let savedText = "Gallon \(gallonTextFieldOutlet.text) is equal to Litre \(litreTextFieldOutlet.text) is equal to Pint \(pintTextFieldOutlet.text)"
        values.append(savedText)
        UserDefaults.standard.setValue(values, forKey: "SavedConversion") 
    }

您将像现在一样将其传递给 v2

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "savedVolumeData"
    {
       let historyVC:VolumeHistoryViewController = segue.destination as! VolumeHistoryViewController
        
        if let values = userDefault.value(forKey: "SavedConversion") as? [String] {
        historyVC.volumeDataOne = values //volumeDataOne now needs to be an [String]
        }
    }

然后在 V2 上,遍历数组和标签。