选择器数据的属性不会保留for循环的结果

问题描述 投票:0回答:1

我是Swift的新手,正在实现我的第一个UIPickerView。如果我像viewDidLoad一样直接在pickerData = ["item1", "item2"]中设置pickerData,它工作正常。但我需要从Firebase数据库构建选择器项。

我能够使用从数据库中提取数据并创建列表的方法来构建选择器项目。然后我拿出那个列表并构建我的选择器项目。我可以打印数组,我看到数组构造正确。

但是当数组完成后,它显然要么再次恢复为空并且我的选择器视图为空,或者我的选择器视图在数组完成之前已经设置好,所以它是空的。

我尝试在几个地方使用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

print语句的输出如下(注意最后一个print语句打印,它打印一个空数组!):

这里是pickerdata:[]

[“娃娃(0.75美元)”]

[“娃娃(0.75美元)”,“熊(0.75美元)”]

[“娃娃(0.75美元)”,“熊(0.75美元)”,“卡车(0.75美元)”]

[“娃娃(0.75美元)”,“熊(0.75美元)”,“卡车(0.75美元)”,“街区(0.75美元)”]

这是pickerdata:[“娃娃(0.75美元)”,“熊(0.75美元)”,“卡车(0.75美元)”,“街区(0.75美元)”]

ios swift uipickerview var
1个回答
0
投票

您需要在完成时重新加载pickerView,因为它是异步的

for item in toyList {   
  // ......
  self.pickerData.append(pickerItem)
  print(self.pickerData)
}
self.pickerView.reloadAllComponents()
© www.soinside.com 2019 - 2024. All rights reserved.