0

我有一个 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 每次打开时都会以随机顺序显示数组,如何解决这个问题。

4

2 回答 2

1

所以,在调用之前:

pickerView.reloadAllComponents()

你可以对数组进行排序

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

它会解决你的问题

于 2019-09-10T16:42:41.687 回答
1

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

重要的

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

相反,对于非文件 URL,请考虑使用类的dataTask(with:completionHandler:) 方法URLSession。有关示例,请参阅将网站数据提取到内存中。

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

if let categories = tempCategories {
    let sortedKeys = categories.keys.sorted()
    allCategories = sortedKeys.map{ Category(name: $0, items: categories[$0]!) }
}
于 2019-09-10T16:31:22.633 回答