首页 > 解决方案 > 为什么我的 json 不能将列表中的所有对象解析为带有标题的不同行?

问题描述

斯威夫特 4 问题

Json 不会解析成单独的 tableview 单元格标题

我正在尝试让我的 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()

}

谢谢!

标签: jsonswiftuitableview

解决方案


您应该在 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
}

推荐阅读