我不知道为什么单元格不返回数据。
我可以使用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”],它将正确返回。
此外,控制台上的打印结果将返回所有需要在表视图中显示的数据。
我在做什么错了?
答案 0 :(得分:0)
在您的getJson函数中,此行
let muscleGroup = muscle.excerciseName
正在创建一个名为muscleGroup
的新局部变量,将行更改为
self.muscleGroup.append(muscle.excerciseName)
即摆脱let
和append
主数组变量
也移动
DispatchQueue.main.async {
self.tableView.reloadData()
}
处于muscles
的for循环之外,因为您要强制为每个条目而不是在完成时重新加载表
答案 1 :(得分:0)
您可能想使用整个结构
替换
var muscleGroup = [String]()
使用
var muscleGroups = [MuscleGroup]()
替换
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()
}
替换
cell.textLabel?.text = self.muscleGroup[indexPath.row]
使用
cell.textLabel?.text = self.muscleGroups[indexPath.row].muscleGroup