【发布时间】:2021-06-03 05:03:13
【问题描述】:
我正在使用 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]
}
}
}
在我的规范中,我被告知数据需要持久化,并且一次只能存储最后五个数据。因此,我有一个名为 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 中测试了我的 Queue 类,它按预期工作。队列类可以在这里看到:
类队列{
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 中的持久数据只采用了一个字符串,当我使用相同的键时,字典将覆盖它。
但是,我查看了文档并尝试使用用户默认数组并没有解决我的问题,我不确定是什么导致了这个问题。
感谢您为尝试解决此问题提供的任何指导和帮助。
谢谢
【问题讨论】:
标签: ios arrays swift nsuserdefaults userdefaults