UiPicker未加载值和索引超出范围

时间:2019-04-29 06:26:50

标签: ios swift uipickerview

除以下代码外,UIPickerView中的n个值是通过远程服务器的rest调用获取的。但是这些值不会显示在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 :(得分:0)

所有UI更新应在所谓的主线程或UI线程上进行。如注释中所述,在主线程中运行重新加载:

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