属性 for picker 数据不会保留 for 循环的结果
Property for picker data won't retain result of for loop
我是 Swift 的新手,正在实现我的第一个 UIPickerView。如果我像 pickerData = ["item1", "item2"]
一样直接在 viewDidLoad
中设置 pickerData,它工作正常。但我需要从 Firebase 数据库构建选择器项目。
我能够使用一种从数据库中提取数据并创建列表的方法来构建选择器项目。然后我获取该列表并构建我的选择器项目。我可以打印数组,我看到数组构造正确。
但是当阵列完成后,它显然要么再次恢复为空,我的 pickerview 为空,要么我的 pickerview 在阵列完成之前设置,因此它为空。
我尝试在几个地方使用 Dispatch.main.async
- 包括我的数据检索函数中的完成语句,围绕 pickerData
的构建等。我还尝试将整个代码用于数据pickerData
数组的检索和构造为 viewDidLoad
,但它始终是相同的。 pickerData
没有保留我为其构造的数组,pickerView为空
这是我的代码(写在Xcode 10,Swift 4.2),来自viewDidLoad
:
func viewDidLoad() {
// Set up the pickerview
ToyService.getToyList(kid: self.kid!) { (toyList) in
self.pickerData.removeAll()
// Go through each toy item and create a picker item from it
for item in toyList {
// Set up a formatter to work with the price as a string
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
let price = formatter.string(from: item.price!)
let pickerItem:String = item.title! + " " + "($" + price! + ")"
self.pickerData.append(pickerItem)
print(self.pickerData)
}
print("here's the pickerdata: \(self.pickerData)")
}
print("here's the pickerdata again: \(self.pickerData)")
} // end of viewDidLoad
打印语句的输出如下(注意最后一个打印语句先打印,它打印的是一个空数组!):
here's the pickerdata again: []
["doll ([=20=].75)"]
["doll ([=20=].75)", "bear ([=20=].75)"]
["doll ([=20=].75)", "bear ([=20=].75)", "truck ([=20=].75)"]
["doll ([=20=].75)", "bear ([=20=].75)", "truck ([=20=].75)", "blocks ([=20=].75)"]
here's the pickerdata: ["doll ([=20=].75)", "bear ([=20=].75)", "truck ([=20=].75)", "blocks ([=20=].75)"]
您需要在完成中重新加载 pickerView,因为它是异步的
for item in toyList {
// ......
self.pickerData.append(pickerItem)
print(self.pickerData)
}
self.pickerView.reloadAllComponents()
我是 Swift 的新手,正在实现我的第一个 UIPickerView。如果我像 pickerData = ["item1", "item2"]
一样直接在 viewDidLoad
中设置 pickerData,它工作正常。但我需要从 Firebase 数据库构建选择器项目。
我能够使用一种从数据库中提取数据并创建列表的方法来构建选择器项目。然后我获取该列表并构建我的选择器项目。我可以打印数组,我看到数组构造正确。
但是当阵列完成后,它显然要么再次恢复为空,我的 pickerview 为空,要么我的 pickerview 在阵列完成之前设置,因此它为空。
我尝试在几个地方使用 Dispatch.main.async
- 包括我的数据检索函数中的完成语句,围绕 pickerData
的构建等。我还尝试将整个代码用于数据pickerData
数组的检索和构造为 viewDidLoad
,但它始终是相同的。 pickerData
没有保留我为其构造的数组,pickerView为空
这是我的代码(写在Xcode 10,Swift 4.2),来自viewDidLoad
:
func viewDidLoad() {
// Set up the pickerview
ToyService.getToyList(kid: self.kid!) { (toyList) in
self.pickerData.removeAll()
// Go through each toy item and create a picker item from it
for item in toyList {
// Set up a formatter to work with the price as a string
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
let price = formatter.string(from: item.price!)
let pickerItem:String = item.title! + " " + "($" + price! + ")"
self.pickerData.append(pickerItem)
print(self.pickerData)
}
print("here's the pickerdata: \(self.pickerData)")
}
print("here's the pickerdata again: \(self.pickerData)")
} // end of viewDidLoad
打印语句的输出如下(注意最后一个打印语句先打印,它打印的是一个空数组!):
here's the pickerdata again: []
["doll ([=20=].75)"]
["doll ([=20=].75)", "bear ([=20=].75)"]
["doll ([=20=].75)", "bear ([=20=].75)", "truck ([=20=].75)"]
["doll ([=20=].75)", "bear ([=20=].75)", "truck ([=20=].75)", "blocks ([=20=].75)"]
here's the pickerdata: ["doll ([=20=].75)", "bear ([=20=].75)", "truck ([=20=].75)", "blocks ([=20=].75)"]
您需要在完成中重新加载 pickerView,因为它是异步的
for item in toyList {
// ......
self.pickerData.append(pickerItem)
print(self.pickerData)
}
self.pickerView.reloadAllComponents()