Почему мой json не разбирает все объекты в списке на разные строки с заголовком? - PullRequest
0 голосов
/ 12 мая 2019

Swift 4 Вопрос

Json не разбирает отдельные заголовки ячеек таблицы

Я пытаюсь получить заголовок UITableView для отображения напечатанного напечатанного json, показанного здесь

https://i.imgur.com/yuOWW74.png

Однако, когда я запускаю программу, вывод показывает https://i.imgur.com/A00t6rE.png

Мой текущий фрагмент кода для получения данных в титровальный объект -

func fetchPlayerStats(completion: @escaping (Result<[beatMaps], Error>) -> ()) {
    let urlString = "https://osu.ppy.sh/api/get_beatmaps?&k=983e993af59aa75b73d21cd42b4dfe96db068802"
    guard let url = URL(string: urlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, resp, err) in

        if let err = err {
            completion(.failure(err))
            return
        }

        do {
            let playerInfo = try JSONDecoder().decode([beatMaps].self, from: data!)
            completion(.success(playerInfo))
        } catch let jsonError {
            completion(.failure(jsonError))
        }

        }.resume()
}
func start() {

    fetchPlayerStats { (res) in
        switch res {
        case .success(let playerInfo):
            playerInfo.forEach({ (info) in
                print(info.title)
                DispatchQueue.main.async {
                    self.titleLabel.text = info.title
                }

            })
        case .failure(let err):
            print("failed", err)
        }
    }
}

и мойкласс tableviewcell

  class BeatMapCell: UITableViewCell {

let cellView: UIView = {
    let view = UIView()
    view.backgroundColor = .white
    view.setCellShadow()
    return view
}()
let pictureImageView: UIImageView = {
    let iv = UIImageView()
    iv.contentMode = .scaleAspectFit
    iv.backgroundColor = .red
    return iv

}()
let titleLabel: UILabel = {
    let label = UILabel()
    label.text = "Name"
    label.textColor = UIColor.darkGray
    label.font = UIFont.boldSystemFont(ofSize: 16)
    return label
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    setUp()

}

Спасибо!

1 Ответ

0 голосов
/ 12 мая 2019

Вы должны вызвать этот метод внутри vc и сделать массив в качестве источника данных таблицы, а затем обновить его в обратном вызове

var tableArr = [BeatMaps]()   // start class/struct names with capital letter 

func start() {
 fetchPlayerStats { (res) in
        switch res {
        case .success(let playerInfo):
           self.tableArr =  playerInfo 
           DispatchQueue.main.async {
              self.tableView.reloadData()
            } 
         })
        case .failure(let err):
            print("failed", err)
        }
    }
}

в настоящее время вы загружаете массив несколько раз для каждой ячейки и из-заforEach устанавливает последний заголовок элемента для метки tableView


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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! BeatMapCell
    cell.label.text = tableArr[indexPath.row].title
    return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...