使用 swift 中的 JSON 数据填充选择器视图的最佳方法是什么?
what is the best way to populate a picker view with JSON data in swift?
我正在 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)
}
}
}
}
}
创建一个符合Decodable
协议的结构并添加所需的属性
struct Country: Decodable {
var name: String?
}
- 在您的 class
中创建一个名为 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 模式匹配,解析将在没有循环的情况下完成。
我正在 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)
}
}
}
}
}
创建一个符合Decodable
协议的结构并添加所需的属性
struct Country: Decodable {
var name: String?
}
- 在您的 class 中创建一个名为
- 执行 HTTP 调用
- 从服务器获取数据
- 使用
JSONDecoder
解析并加载到 - 解析后重新加载countryPickerView
countryArray
的 Country
对象类型数组
countryArray
对象
请按照下面的示例进行操作
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 模式匹配,解析将在没有循环的情况下完成。