快速使用 JSON 数据填充选择器视图的最佳方法是啥?
Posted
技术标签:
【中文标题】快速使用 JSON 数据填充选择器视图的最佳方法是啥?【英文标题】:what is the best way to populate a picker view with JSON data in swift?快速使用 JSON 数据填充选择器视图的最佳方法是什么? 【发布时间】:2020-04-25 18:34:41 【问题描述】:我正在 ios 上构建 COVID-19 应用跟踪器。
为了按国家/地区显示数据,我构建了一个包含所有国家/地区名称的pickerView。
感谢 HTTP cal,我已经设法获取 JSON 数据,即每个国家/地区的名称。理想情况下,我希望将每个值附加到一个数组中,然后再填充pickerView。
这可能吗?如果是,我会怎么做?
我也对其他方式持开放态度。这是我的代码:
@IBOutlet weak var confirmedCasesLabel: UILabel!
@IBOutlet weak var deathsLabel: UILabel!
@IBOutlet weak var recoveriesLabel: UILabel!
//MARK: - Relevant variables
private let covidUrl: String = "https://corona-api.com/countries"
var countryArray: [String] = [String]()
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
countryPickerView.delegate = self
countryPickerView.dataSource = self
//
httpCall()
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
*/
//MARK: - Functions that handles picker view delegates and data source
func numberOfComponents(in pickerView: UIPickerView) -> Int
return 1
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
return countryArray.count
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
return countryArray[row]
//MARK: - HTTP CALL - GET COUNTRY DATA
func httpCall()
request(covidUrl, method: .get).responseJSON (response) in
if response.result.isSuccess
//test just print some data
let dataJSON: JSON = JSON(response.result.value)
//print(dataJSON)
//on va identifier chaque pays + l'ajouter au tableau des pays
// let countryNameJSON = dataJSON["data"][99]["name"]
// print(countryNameJSON)
for country in 0...99
let countryNameJSON = dataJSON["data"][country]["name"].stringValue
print(countryNameJSON)
//on ajoute ce nom au tabeleau de pays
//self.countryArray.append(countryNameJSON)
【问题讨论】:
创建一个自定义结构,使用Codable
加载数据并使用countryArray[row].name
填充选择器视图。没有循环,没有过时的 SwiftyJSON,没有映射。
【参考方案1】:
创建一个符合Decodable
协议的结构并添加所需的属性
struct Country: Decodable
var name: String?
在您的类中创建一个名为 countryArray
的 Country
对象类型数组
执行 HTTP 调用
从服务器获取数据
使用JSONDecoder
解析并加载到countryArray
对象中
解析后重新加载countryPickerView
请按照以下示例进行操作
class YourClass
@IBOutlet weak var countryPickerView: UIPickerView!
var countryArray = [Country]()
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
countryPickerView.delegate = self
countryPickerView.dataSource = self
httpCall()
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
return countryArray.count
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
return countryArray[row].name
//MARK: - HTTP CALL - GET COUNTRY DATA
func httpCall()
request(covidUrl, method: .get).responseJSON (response) in
if response.result.isSuccess
let countryArray = try JSONDecoder().decode([Country].self, from: #yourJsonData#)
countryPickerView.reloadAllComponents()
由于Country
对象符合Decodable
协议,因此解析将在没有循环的情况下完成,因为Struct
与您的JSON 架构匹配。
【讨论】:
以上是关于快速使用 JSON 数据填充选择器视图的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在一个视图上使用不同数据填充多个表的最佳方法是啥? [关闭]