我如何将我的JSON API请求实现到UITableViewCell中?

时间:2019-05-16 11:21:22

标签: swift json-api swift5 wordpress-json-api

我当前的项目有问题。首先,我喜欢实现一个JSON API请求,该请求使我可以从URL获得标题。问题:我想将JSON数据显示到UITableViewCell中。

但是Xcode会引发以下错误:

  

无法分配类型为“ FirstViewController.Title”的值来键入   “字符串?”

也许我的代码中有更多错误,因为我只是Swift / Xcode的初学者

我已经尝试过:

cell.textLabel?.text = course.title as? String

但是我收到如下警告消息:

Cast from 'FirstViewController.Title' to unrelated type 'String' always fails

这是我的代码示例:

var courses = [Course]()
let cell = "ItemCell"

override func viewDidLoad() {
    super.viewDidLoad()

    fetchJSON()
}

struct Course: Codable {
    let title: Title

    enum CodingKeys: String, CodingKey {
        case title
        case links = "_links"
    }
}

struct Links: Codable {
}

struct Title: Codable {
    let rendered: String
}


fileprivate func fetchJSON() {
    let urlString = "ExampleURL"
    guard let url = URL(string: urlString) else { return }
    URLSession.shared.dataTask(with: url) { (data, _, err) in
        DispatchQueue.main.async {
            if let err = err {
                print("Failed to get data from url:", err)
                return
            }

            guard let data = data else { return }

            do {

                let result = try JSONDecoder().decode(Course.self, from: data)


                self.tableView.reloadData()
            } catch let jsonErr {
                print("Failed to decode:", jsonErr)
            }
        }
        }.resume()
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return courses.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: .value1, reuseIdentifier: "ItemCell")
    let course = courses[indexPath.row]
    cell.textLabel?.text = course.title as? String // Cast from 'FirstViewController.Title' to unrelated type 'String' always fails
    return cell
}

我只想将WordPress个帖子发布到UITableView-UITableViewCell中。

也许您可以告诉我我尝试过的方法是否错误,但是我真的不知道如何解决这个问题

提前谢谢

1 个答案:

答案 0 :(得分:-1)

在重新加载之前分配变量

 let res = try JSONDecoder().decode(Course.self, from: data)
 courses.append(res)
 DispatchQueue.main.async {
     self.tableView.reloadData()
 }

并将其设置为字符串值

 cell.textLabel?.text = course.title.rendered

 courses = try JSONDecoder().decode([Course].self, from: data)
 print(courses)