如何按字母顺序在 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:排序和显示值数组会导致移动时崩溃?