从JSON填充单元格时表为空

时间:2018-08-08 22:01:47

标签: json swift uitableview parsing

我正在尝试用json内容填充表。除了表未显示任何数据之外,其他所有内容似乎都正常运行。实际上,下面显示的代码应将每个json数据数组的“标题”信息显示在一个单元格中。见

  

cell.textLabel?.text = myNewsItems [indexPath.row] .title

但是,从控制台输出中可以看到,我可以验证新闻数组是否按预期进行了解析(请参阅Checkpoint:print(myNewsS))。

知道我缺少什么吗?

Swift4

import UIKit

// structure from json file
struct News: Codable{
    let type: String
    let timestamp: String
    let title: String
    let message: String
}

class HomeVC: UIViewController, UITableViewDelegate, UITableViewDataSource{
    var myTableView = UITableView()
    var myNewsItems: [News] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        let barHeight: CGFloat = UIApplication.shared.statusBarFrame.size.height
        let displayWidth: CGFloat = self.view.frame.width
        let displayHeight: CGFloat = self.view.frame.height

        myTableView = UITableView(frame: CGRect(x: 0, y: 150, width: displayWidth, height: displayHeight - barHeight))
        myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        myTableView.dataSource = self
        myTableView.delegate = self
        self.view.addSubview(myTableView)

        // JSON

        let url=URL(string:"https://api.myjson.com/bins/ywv0k")
        let session = URLSession.shared
        let task = session.dataTask(with: url!) { (data, response, error) in

            // check status 200 OK etc.

            guard let data = data else { return }

            do {
                let myNewsS = try
                    JSONDecoder().decode([News].self, from: data)
                print(myNewsS)

                DispatchQueue.main.async {
                    self.myTableView.reloadData()
                }

            } catch let jsonErr {
                print("Error json:", jsonErr)
            }

        }
        task.resume()
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

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


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = myNewsItems[indexPath.row].title
        return cell
    }
}

1 个答案:

答案 0 :(得分:2)

分配数组

myNewsItems = myNewsS 
DispatchQueue.main.async {
    self.myTableView.reloadData()
}