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

Posted

技术标签:

【中文标题】在选取器视图中从 JSON 加载数据【英文标题】:Load data from JSON in picker view 【发布时间】:2018-04-01 17:07:07 【问题描述】:

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

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

我想在选择器视图中加载此 JSON 的标题,当我选择其中一个时,所选行的 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

我该怎么办?

【问题讨论】:

【参考方案1】:

从 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

【讨论】:

谢谢你,它工作。是的,这个名字是我的错。那么,现在如何获取所选行的 id? 这是一个单独的问题。这是关于加载选择器视图的。但作为提示,请实现 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 方法。 我为获取 id 编写了这段代码: func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) var dict = self.dictionary[row] selectedDepID = String(describing: dict["id"]) 这是真的,但首先,它不返回第一行。但如果我更改选择器值并再次返回第一行,我可以。为什么?????? 切勿使用String(describing:) 向用户显示值或将值转换为字符串。仅用于调试。 那我应该用什么来代替描述呢?【参考方案2】:

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

DispatchQueue.main.async 
    pickerDep.reloadAllComponents()

【讨论】:

以上是关于在选取器视图中从 JSON 加载数据的主要内容,如果未能解决你的问题,请参考以下文章

在自定义选取器中重新加载数据

如何正确处理更新视图中的选取器(SwiftUI)

如何在同一视图中使用具有不同数据源的多个选取器视图?

根据在选取器视图中选择的行组件更新表视图数据

如何根据在选取器视图中选择的行组件更新表视图数据

如何在视图控制器中为子类选取器视图实现 selectedrow