Свойство для данных выбора не сохранит результат цикла for - PullRequest
0 голосов
/ 09 марта 2019

Я новичок в Swift и внедряю свой первый UIPickerView.Это работает нормально, если я устанавливаю pickerData непосредственно в viewDidLoad как pickerData = ["item1", "item2"].Но мне нужно создать элементы выбора из базы данных 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 печатается первым, и он печатает пустой массив!):

снова вот данные выбора: []

["doll ($ 0.75)"]

["doll (0,75 долл. США "," медведь (0,75 долл. США) "]

[" кукла (0,75 долл. США) "," медведь (0,75 долл. США) "," грузовик (0,75 долл. США) "]

[" кукла (0,75 долл. США)) "," bear ($ 0,75) "," truck ($ 0,75) "," blocks ($ 0,75) "]

вот такие данные выбора: [" doll ($ 0,75) "," bear ($ 0,75) ","грузовик (0,75 долл. США) "," блоки (0,75 долл. США) "]

1 Ответ

0 голосов
/ 09 марта 2019

Вам необходимо перезагрузить pickerView внутри завершения, так как оно асинхронное

for item in toyList {   
  // ......
  self.pickerData.append(pickerItem)
  print(self.pickerData)
}
self.pickerView.reloadAllComponents()
...