在选取器视图中从 JSON 加载数据

Load data from JSON in picker view

我从服务器获取数据,我有以下 JSON:

(
    {
        id = 1;
        status = 1;
        title = "jimmy";
    },
        {
        id = 2;
        status = 1;
        title = "arnold";
    },
        {
        id = 3;
        status = 1;
        title = "mike";
    }
)

我想在选择器视图中加载此 JSON 的标题,当我 select 其中之一时,selected 行的 ID 在 myID 中设置多变的。 我写了下面的代码,但选择器视图没有显示任何内容:

var dictionary = [[String : AnyObject]]()

override func viewDidLoad() {
    super.viewDidLoad()

    pickerDep.delegate = self
    pickerDep.dataSource = self

    var Token=FuncClass.ReadData(_file: "fileToken.txt")
    let url=Property._URL+"getTicketDepartment"
    let parameters = [
        "token": Token
    ]

    Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.httpBody).responseJSON { response in
        if let data = response.data {
            let json = String(data: data, encoding: String.Encoding.nonLossyASCII)

            let result=response.result
            self.dictionary = (result.value as? [Dictionary<String,AnyObject>])!
        }
    }
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return dictionary.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return dictionary[row]["title"] as! String
}

我该怎么办?

从 Alamofire 加载数据后,您需要重新加载选择器视图:

Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.httpBody).responseJSON { response in
    if let data = response.data {
        let json = String(data: data, encoding: String.Encoding.nonLossyASCII)

        let result=response.result
        if let array = result.value as? [Dictionary<String,AnyObject>] {
            self.dictionary = array
            pickerDep.reloadAllComponents()
        }
    }
}

顺便说一句 - 为什么你的 属性 包含数据数组时命名为 dictionary

这是一个老问题,但我也遇到过这个问题。当我在我的应用程序中使用 reloadAllComponents() 覆盖 func viewDidLoad() 时,我的应用程序挂起 4-5 秒。然后刷新 pickerView 或崩溃。我通过添加 DispatchQueue 功能解决了这个问题。我对此 post 的解决方案是

DispatchQueue.main.async {
    pickerDep.reloadAllComponents()
}