在Swift 4中解析JSON后,为什么会得到空白的UITableView?

时间:2019-02-03 19:14:29

标签: ios json swift iphone uitableview

我不知道为什么单元格不返回数据。

我可以使用Decodable正常解析,这意味着它可以正常工作。

我一直在尝试找到的所有方法,但都没有成功。

struct MuscleGroup: Decodable {
   let ExcerciseID: String
   let description: String
   let excerciseName: String
   let muscleGroup: String
}


class ExerciseListViewController: UITableViewController {




var muscleGroup = [MuscleGroup]()


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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ExerciseList", for: indexPath) as! ExcerciseList

    let muscle = muscleGroup[indexPath.row]

    cell.textLabel!.text = muscle.excerciseName
    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print(self.muscleGroup[indexPath.row])
    tableView.deselectRow(at: indexPath, animated: true)
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.dataSource = self
    self.tableView.delegate = self
    getJson()

}




func getJson(){

    guard let url = URL(string: "https://jsonurl") else { return }

    let session = URLSession.shared
    session.dataTask(with: url) { (data, response, error) in
        if let response = response {
            print(response)
        }

        if let data = data {
            print(data)
            do {
                let muscles = try JSONDecoder().decode([MuscleGroup].self, from: data)
                for muscle in muscles {


                    let muscleGroup = muscle.excerciseName
                    print(muscleGroup)
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }

                }
            } catch {
                print(error)
            }

        }
        }.resume()



}

如果我将var muscleGroup = String更改为[“ Cest”,“ Back”,“ Abdominals”,“ Arms”,“ Legs”],它将正确返回。

此外,控制台上的打印结果将返回所有需要在表视图中显示的数据。

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

在您的getJson函数中,此行

let muscleGroup = muscle.excerciseName

正在创建一个名为muscleGroup的新局部变量,将行更改为

self.muscleGroup.append(muscle.excerciseName)

即摆脱letappend主数组变量

的值

也移动

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

处于muscles的for循环之外,因为您要强制为每个条目而不是在完成时重新加载表

答案 1 :(得分:0)

您可能想使用整个结构

  1. 替换

    var muscleGroup = [String]()
    

    使用

    var muscleGroups = [MuscleGroup]()
    
  2. 替换

    let muscles = try JSONDecoder().decode([MuscleGroup].self, from: data)
    for muscle in muscles {
    
       let muscleGroup = muscle.excerciseName
       print(muscleGroup)
       DispatchQueue.main.async {
          self.tableView.reloadData()
       }
    }
    

    使用

    self.muscleGroups = try JSONDecoder().decode([MuscleGroup].self, from: data)
    DispatchQueue.main.async {
       self.tableView.reloadData()
    }
    
  3. 替换

    cell.textLabel?.text = self.muscleGroup[indexPath.row]
    

    使用

    cell.textLabel?.text = self.muscleGroups[indexPath.row].muscleGroup