我是Swift的新手,正在实现我的第一个UIPickerView。如果我像viewDidLoad
一样直接在pickerData = ["item1", "item2"]
中设置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
打印语句的输出如下(注意最后一条打印语句先打印,然后打印一个空数组!):
再次是选择器数据:[]
[“娃娃($ 0.75)”]
[“娃娃($ 0.75)”,“熊($ 0.75)”]
[“娃娃($ 0.75)”,“熊($ 0.75)”,“卡车($ 0.75)”]
[“娃娃($ 0.75)”,“熊($ 0.75)”,“卡车($ 0.75)”,“积木($ 0.75)”]
以下是选择器数据:[“娃娃($ 0.75)”,“熊($ 0.75)”,“卡车($ 0.75)”,“积木($ 0.75)”]
答案 0 :(得分:0)
您需要在补全中重新加载pickerView,因为它是异步的
for item in toyList {
// ......
self.pickerData.append(pickerItem)
print(self.pickerData)
}
self.pickerView.reloadAllComponents()