如何在 pickerview 中获取(使用 struct:codable)解析字符串的结果
How to get result of ( used struct:codable) parsing string in a pickerview
我已经点击了 API 并成功收到回复。我这里使用了codable来解析。1.But无法得到特定的值。 ID?
2. 选择器首先被调用并且没有加载我们解析的字符串。
从 codable 解析有点粘。如何获取其中的数组内容,例如将id值放入其中。
可编码部分:
结构原因:可编码{
让 reason_and_whom_meet :两者都有?
}
struct both :Codable{
let reason_list : [reasonlist]?
let whom_meet : [nameList]?
}
struct reasonlist :Codable{
let id: Int? //This "id" i couldnt access.
let reason : String?
enum CodingKeys: String, CodingKey {
case reason
case id
}
}
struct nameList :Codable{
let name : String?
enum CodingKeys: String, CodingKey{
case name
}
}
我收到的 json 结构所做的可编码结构。我应该更改我使用的结构的结构吗?
如果您想要 json 值,我也可以提供,但该结构是 json 的确切层次结构。
代码部分:
do {
let gotData = try JSONDecoder().decode(Reasons.self, from: data!)
let persons = gotData.reason_and_whom_meet?.whom_meet
self.wtmArray.add(persons)
print(self.wtmArray)
let reasons = gotData.reason_and_whom_meet?.reason_list
self.reasonArray.add(reasons)
print(self.reasonArray)
let reasonID = gotData.reason_and_whom_meet?.reason_list![self.reasonID]
print(reasons)
} catch let err {
print("Error", err)
}
此外,选择器委托方法首先被调用,但当时响应为空。如何解决这个问题?我的选择器显示为空。响应如下:
"GoogleClassroomPoC.nameList(name: Optional(\"Teacher\"))"
但我的数组中只需要那位老师和校长。我应该将其转换为任何格式还是我们可以直接在 pickerview 中显示它。
我正在为这个解析而苦恼,请帮忙!
我已经创建了一个简单的代码,它与您关于如何让它工作的场景相似。
1. 一个简单的 UIPickerView
,带有单个组件,显示 reason
of reason_list
of both
.
var data: both?
@IBOutlet weak var picker: UIPickerView!
override func viewDidLoad()
{
super.viewDidLoad()
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
return self.data?.reason_list?.count ?? 0
}
func numberOfComponents(in pickerView: UIPickerView) -> Int
{
return 1
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
return self.data?.reason_list?[row].reason
}
最初,当加载 ViewController
时,data
是 nil
,因此 UIPickerView
不显示任何内容。
2. 我创建了一个 UIButton
来加载 data
并重新加载 UIPickerView
。我使用了一些硬编码数据。您可以从 API.
中获取此数据
@IBAction func loadData(_ sender: UIButton)
{
let jsonString = """
{
"reason_list": [
{"id": 1, "reason": "ABCD"},
{"id": 2, "reason": "WXYZ"}
]
}
"""
if let data = jsonString.data(using: .utf8)
{
self.data = try? JSONDecoder().decode(both.self, from: data)
DispatchQueue.main.async {[weak self] in
self?.picker.reloadComponent(0) //HERE..!!!
}
}
}
如果您仍然遇到任何问题,请告诉我。
我已经点击了 API 并成功收到回复。我这里使用了codable来解析。1.But无法得到特定的值。 ID? 2. 选择器首先被调用并且没有加载我们解析的字符串。
从 codable 解析有点粘。如何获取其中的数组内容,例如将id值放入其中。
可编码部分:
结构原因:可编码{
让 reason_and_whom_meet :两者都有?
}
struct both :Codable{
let reason_list : [reasonlist]?
let whom_meet : [nameList]?
}
struct reasonlist :Codable{
let id: Int? //This "id" i couldnt access.
let reason : String?
enum CodingKeys: String, CodingKey {
case reason
case id
}
}
struct nameList :Codable{
let name : String?
enum CodingKeys: String, CodingKey{
case name
}
}
我收到的 json 结构所做的可编码结构。我应该更改我使用的结构的结构吗?
如果您想要 json 值,我也可以提供,但该结构是 json 的确切层次结构。
代码部分:
do {
let gotData = try JSONDecoder().decode(Reasons.self, from: data!)
let persons = gotData.reason_and_whom_meet?.whom_meet
self.wtmArray.add(persons)
print(self.wtmArray)
let reasons = gotData.reason_and_whom_meet?.reason_list
self.reasonArray.add(reasons)
print(self.reasonArray)
let reasonID = gotData.reason_and_whom_meet?.reason_list![self.reasonID]
print(reasons)
} catch let err {
print("Error", err)
}
此外,选择器委托方法首先被调用,但当时响应为空。如何解决这个问题?我的选择器显示为空。响应如下:
"GoogleClassroomPoC.nameList(name: Optional(\"Teacher\"))"
但我的数组中只需要那位老师和校长。我应该将其转换为任何格式还是我们可以直接在 pickerview 中显示它。
我正在为这个解析而苦恼,请帮忙!
我已经创建了一个简单的代码,它与您关于如何让它工作的场景相似。
1. 一个简单的 UIPickerView
,带有单个组件,显示 reason
of reason_list
of both
.
var data: both?
@IBOutlet weak var picker: UIPickerView!
override func viewDidLoad()
{
super.viewDidLoad()
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
return self.data?.reason_list?.count ?? 0
}
func numberOfComponents(in pickerView: UIPickerView) -> Int
{
return 1
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
return self.data?.reason_list?[row].reason
}
最初,当加载 ViewController
时,data
是 nil
,因此 UIPickerView
不显示任何内容。
2. 我创建了一个 UIButton
来加载 data
并重新加载 UIPickerView
。我使用了一些硬编码数据。您可以从 API.
@IBAction func loadData(_ sender: UIButton)
{
let jsonString = """
{
"reason_list": [
{"id": 1, "reason": "ABCD"},
{"id": 2, "reason": "WXYZ"}
]
}
"""
if let data = jsonString.data(using: .utf8)
{
self.data = try? JSONDecoder().decode(both.self, from: data)
DispatchQueue.main.async {[weak self] in
self?.picker.reloadComponent(0) //HERE..!!!
}
}
}
如果您仍然遇到任何问题,请告诉我。