Заполнение UIPIckerView с удаленным массивом JSON - PullRequest
0 голосов
/ 29 апреля 2020

Я загружаю массив JSON с удаленного сервера:

var colores = [Colores]()


func downloadJSONColores(completed: @escaping () -> ()) {
         let url = URL(string: "https://../colores.php")


         URLSession.shared.dataTask(with: url!) { (data,response,error) in

            print(data as Any)
            print(response as Any)

         if error == nil {
             do {
                 self.colores = try JSONDecoder().decode([Colores].self, from: data!)

                 DispatchQueue.main.async {
                     completed()
                 }

             }catch{

             }

         }
         }.resume()


     }

У меня есть класс struct для Colores:

struct Colores:Decodable {

    let id: Int
    let nombre: String
    let icono: String
    let modelo: Int
    let caracterista: Int

}

Мне нужно заполнить PickerView с декодированными объектами JSON, отображающими номер поля в качестве заголовка и сохраняющими идентификатор поля из выбранного элемента средства выбора.

Я вызываю метод downloadJSONColores в viewDidLoad следующим образом:

downloadJSONColores {
            coloresPV.reloadData()
                     }

где coloresPV - мой pickerView, но, очевидно, этот способ работает только для collectionViews, а не для pickerView. Каков наилучший способ заполнить представление pickerView при выполнении downloadJSONColores?

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Я решил мою проблему с декодированием массива JSON непосредственно в методе viewDidLoad следующим образом:

let url = URL(string: "https://..")!
let dataTask = URLSession.shared.dataTask(with: url) { data, _, error in
    if let error = error { print(error); return }
    do {
        let result = try JSONDecoder().decode([Colores].self, from: data!)
        print(result)
        self.colores = result.map{$0.self}
        DispatchQueue.main.async {
          self.coloresPV.reloadAllComponents()
        }
    } catch { print(error) }
}
dataTask.resume()
0 голосов
/ 29 апреля 2020

Посмотрите на UIPickerViewDataSource и UIPickerViewDelegate протоколы.

Если я правильно понимаю ваш вопрос, вам нужно сохранить переменную colors: [Colores] в вашем ViewController.

Тогда:

  • Возврат colors.count в вашей реализации функции func numberOfComponents(in: UIPickerView) -> Int UIPickerViewDataSource,

  • Верните правильный заголовок в вашу реализацию в методе pickerView(UIPickerView, titleForRow: Int, forComponent: Int) -> String? функция UIPickerViewDelegate

...