如何按字母顺序在 UIPickerView 中呈现 JSON 数组?

Posted

技术标签:

【中文标题】如何按字母顺序在 UIPickerView 中呈现 JSON 数组?【英文标题】:How to present JSON array in UIPickerView in alphabetical order? 【发布时间】:2019-09-10 16:21:53 【问题描述】:

我有一个 UIPickerView,它从 JSON 获取数据并将其呈现在两列中,一列显示两列,生产者和产品使用以下内容:

if let url = URL(string: "https://www.example.com/example"),
                let data = try? Data(contentsOf: url),
                let tmpValues = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [[String:String]] 
                let tempCategories = tmpValues?.reduce(into: [String:[String]](),  (dict, value) in
                    if let producer = value["producer"], let product = value["product"] 
                        dict[producer, default:[]].append(product)
                    
                )
                for category in (tempCategories ?? [:]) 
                    allCategories.append(Category(name: category.key, items: category.value))
                
                pickerView.reloadAllComponents()
            

问题是 JSON 按字母顺序显示数组时,PickerView 每次打开时都按随机顺序显示数组,如何解决此问题。

【问题讨论】:

没有订购什么?字典呈现的类别,还是数组呈现的每个类别中的值?还是两者兼而有之? 显示适当的选择器视图数据源/委托方法。并展示您尝试正确排序用于填充选取器视图的数组。 【参考方案1】:

首先,强烈建议您不要使用同步 Data(contentsOf 从远程 URL 加载数据。来自documentation

重要

不要使用此同步初始化程序来请求基于网络的 URL。对于基于网络的 URL,此方法会在慢速网络上阻塞当前线程数十秒,导致用户体验不佳,并且在 ios 中可能会导致您的应用被终止。

相反,对于非文件 URL,请考虑使用 URLSession 类的 dataTask(with:completionHandler:) 方法。示例见Fetching Website Data into Memory。

其次,字典是无序的。您可以通过这种方式对键进行排序并填充选择器源数组

if let categories = tempCategories 
    let sortedKeys = categories.keys.sorted()
    allCategories = sortedKeys.map Category(name: $0, items: categories[$0]!) 

【讨论】:

【参考方案2】:

所以,在调用之前:

pickerView.reloadAllComponents()

你可以对数组进行排序

allCategories = allCategories.sorted  $0.name < $1.name 

它会解决你的问题

【讨论】:

我收到警告:调用 'sorted(by:)' 的结果未使用

以上是关于如何按字母顺序在 UIPickerView 中呈现 JSON 数组?的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 中的 UITextField 与 UIPickerView?

UIPickerView:排序和显示值数组会导致移动时崩溃?

VS代码扩展:如何为分机的设置/配置设置顺序/优先级?

将 CoreData 对象的字符串属性加载到 UIPickerView

如何按字母顺序对项目进行排序?

excel中怎么将英文单词按字母顺序排序?