UiPicker не загружает значение и индекс выходит за пределы диапазона - PullRequest
0 голосов
/ 29 апреля 2019

За исключением приведенного ниже кода, в UIPickerView n значения принимаются с помощью вызова покоя с удаленного сервера. Но значения не отображаются в UIPickerView. Я проверил, что значения загружаются правильно вызовом rest, но они не отображаются в UIPickerView, как я могу продолжить?

Вид:

self.TipologiaUIPicker = UIPickerView(frame: CGRect(x: (self.view.frame.width / 2) - 70, y: 300, width: 200, height: 50))
self.TipologiaUIPicker.delegate = self
self.TipologiaUIPicker.dataSource = self
//self.TipologiaUIPicker.tag=1
self.TipologiaUIPicker.backgroundColor = UIColor.white
let atemp = ArticoloCantiere(Cantiere: CantiereInterno)
atemp.CaricaTipologieArticoli(completion: { result in
    self.TipologiaLoad = result
    self.TipologiaUIPicker.reloadAllComponents()
});

//Error: index out of range
 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
//        print("\n TipologiaLoad[row].IdUtente \(TipologiaLoad[row].IdTipologiaPreventivo!)")
         DispatchQueue.main.async {
            self.IdTipologia = Int(self.TipologiaLoad[row].IdTipologiaPreventivo)!
        }
       // print("\n TipologiaLoad[row].NomeTipologia \(TipologiaLoad[row].NomeTipologia!)")
    }

Модель:

func CaricaTipologieArticoli(completion: @escaping ([TipologiaStruct]) -> Void) {
    DispatchQueue.global(qos: .userInteractive).async {
        let articolo_temp = ArticoloModel()
        articolo_temp.CaricaTipologia(completion: {
            result in
            completion(result)
        })
    }
}

Контроллер:

func CaricaTipologia(completion: @escaping ([TipologiaStruct]) -> ()) {
    let jsonrequest = JSON()
    let jsonarray: [String: Any] = [:]
    jsonrequest.GetArray(Tipo: "TipologiaStruct", Router: "/preventivo/caricatipologie", ValueArray: jsonarray, completion: { result in
        completion(result as! [TipologiaStruct])
    })
}

1 Ответ

0 голосов
/ 29 апреля 2019

Все обновления пользовательского интерфейса должны происходить в так называемом основном потоке или потоке пользовательского интерфейса. Как уже упоминалось в комментариях, выполните перезагрузку в основном потоке:

atemp.CaricaTipologieArticoli(completion: { result in
    if !result.isEmpty{        
        DispatchQueue.main.async {
            self.TipologiaLoad = result
            self.TipologiaUIPicker.reloadAllComponents()
        }
    }
});
...