ios - 如何获取 ( 使用 struct :codable) parsing string in a pickerview 的结果

标签 ios swift codable

我已访问 API 并成功获得响应。我在这里使用 codable 进行解析。1。但无法获得特定值。 ID? 2. 首先调用选择器,但不加载我们解析的字符串。

从可编码中解析有点粘。如何获取里面的数组内容,比如里面的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)
}

此外,选择器委托(delegate)方法首先被调用,但当时响应为空。如何解决这个问题?我的选择器显示为空。响应如下:

"GoogleClassroomPoC.nameList(name: Optional(\"Teacher\"))"

但我的阵列中需要单独的老师和校长。我应该将其转换为任何格式还是我们可以直接在 pickerview 中显示它。

我正在与这个解析作斗争,请帮忙!

最佳答案

我创建了一个简单的代码,与您的如何实现此功能的场景类似。

1. 一个简单的 UIPickerView,具有单个组件,可显示 reason_listreason 以及 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 时,datanil,因此 UIPickerView 不会显示任何东西。

2. 我创建了一个加载数据UIButton,并且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..!!!
         }
    }
}

如果您仍然遇到任何问题,请告诉我。

关于ios - 如何获取 ( 使用 struct :codable) parsing string in a pickerview 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49381555/

相关文章:

ios - 如何将 Struct 传递给需要 AnyObject 的方法?

ios - iPhone 7 Plus 和 iPhone 6 版本的边界宽度不同

Swift Codable 在嵌套字典上崩溃

json - 设置或覆盖通用编码对象的属性

ios - 监控 UITableViewCell 在屏幕上显示多长时间

ios - 如果忽略“UIGestureRecognizerDelegate”的重复协议(protocol)定义,如何定义目标

ios - 当顶部栏隐藏时,UINavigationController 失去向后滑动功能

swift - 具有多个键和关联值的可编码枚举

ios - MPMovieViewController 下一个/上一个按钮事件

swift - Swift 中的类型检查失败并带有可选值