Почему я получаю пустой UITableView после разбора JSON в Swift 4? - PullRequest
0 голосов
/ 03 февраля 2019

Я не могу понять, почему ячейки не возвращаются с данными.

Я могу нормально анализировать, используя 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 на ["Грудь", "Спина", "Брюшной пресс", "Руки", "Ноги"], он вернется правильно,

Кроме того, результат печати на консоли возвращает все данные, которые должны быть в табличном представлении.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Как вы, вероятно, хотите использовать всю структуру

  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
    
0 голосов
/ 03 февраля 2019

В вашей функции getJson эта строка

let muscleGroup = muscle.excerciseName

создает новую локальную переменную с именем muscleGroup, измените строку на

self.muscleGroup.append(muscle.excerciseName)

т.е. избавьтесь от let и append значение переменной основного массива

Также переместите

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

, чтобы он находился вне цикла for muscles, поскольку вы заставляете таблицу перезагружаться длякаждая запись, а не когда вы закончите

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...