json - 为什么我的 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()
}
谢谢!
解决方案
您应该在 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
}
推荐阅读
- angular - 将属性添加到表中,以便我可以在其上使用 css
- powershell - Exchange 获取最后一个活动不早于的活动邮箱
- c++ - 如何从窗口中删除 TOPMOST 属性
- reactjs - 如何使用预定义的数组初始化一个空的对象数组?
- c# - 如何将具有日期时间的列中的每个单元格从 ms excel 插入到 mysql 数据库?
- c# - 更改 Intellisense 快速信息参数背景/前景色
- c - C:赋值运算符是否深拷贝?
- python - 使用 python pytesseract 从图像中提取文本
- java - Java 9 Splashscreen 问题与 Splashscreen.getSplashScreen();
- c# - 为什么我的代码在我不期望的情况下向 MSMQ 发送相同的消息?