Swift 4中UITableView无法展示Workspace结构体数据问题求助
解决Swift UITableView无法展示JSON解析数据的问题
我看了你的代码,问题其实很清晰——你已经成功解析出了Workspace数组,但完全没把解析结果存到User类的Wor数组里,所以UITableView自然拿不到数据,显示为空~下面一步步帮你修正:
核心问题分析
你在Workspace结构体的getUserWorkspace方法里,已经成功解析出了[Workspace]类型的rep(从打印结果能看出来),但你只是打印了它,根本没把这个数组赋值给User类里的Wor属性。反而一直在操作单个的WorData实例,这个实例还是用默认初始化的"guid"和"name",和你解析出来的真实数据完全无关。
具体修改步骤
1. 把网络请求逻辑移到User类中
把获取Workspace的方法放到User类里,这样可以直接把解析后的结果存入自己的Wor数组,逻辑更合理:
public class User { var Wor = [Workspace]() var Base: String = "" // 确保你这里已经正确赋值Base func getUserWorkspace(completed: @escaping () -> ()) { guard let url = URL(string: "SOME URL") else { print("无效的URL") completed() return } var request = URLRequest(url: url) request.addValue("Basic \(Base)", forHTTPHeaderField: "Authorization") request.addValue("application/json", forHTTPHeaderField: "Accept") URLSession.shared.dataTask(with: request) { [weak self] (data, response, error) in guard let self = self else { return } // 先处理错误 if let error = error { print("请求错误: \(error)") completed() return } guard let data = data else { print("未接收到数据") completed() return } do { // 解析成功后直接赋值给Wor数组 self.Wor = try JSONDecoder().decode([Workspace].self, from: data) print("解析后的工作区数据: \(self.Wor)") DispatchQueue.main.async { completed() } } catch { print("解析错误: \(error)") completed() } }.resume() } }
2. 简化Workspace结构体
因为你已经使用了Decodable,且属性名和JSON字段完全一致,不需要手动写默认初始化和CodingKeys(除非有特殊需求),简化后更清爽:
struct Workspace: Decodable { var guid: String var name: String }
3. 调整视图控制器的调用逻辑
现在直接调用User类的getUserWorkspace方法,数据会自动存入Wor数组,然后刷新表格:
var co = User() override func viewDidLoad() { super.viewDidLoad() // 先设置TableView的代理和数据源! listView.delegate = self listView.dataSource = self co.getBase() // 确保Base已经被正确赋值 co.getUserWorkspace { print("数据请求成功") // 此时Wor数组已经有数据了,刷新表格 self.listView.reloadData() self.updateVertically() // 现在打印就能看到正确的数据了 print("第一个工作区guid: \(self.co.Wor.first?.guid ?? "无")") print("第一个工作区name: \(self.co.Wor.first?.name ?? "无")") print("所有工作区: \(self.co.Wor)") } }
4. 确认TableView数据源方法正确
确保你的TableView数据源方法正确使用co.Wor:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return co.Wor.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "你的CellID", for: indexPath) let workspace = co.Wor[indexPath.row] cell.textLabel?.text = workspace.name // 可以顺便设置guid到detailTextLabel cell.detailTextLabel?.text = workspace.guid return cell }
为什么这样修改能解决问题?
之前的逻辑里,网络请求和数据存储是分离的:你在Workspace结构体里解析出了数据,但没有把数据传递到User类的Wor数组(UITableView依赖的数据源)。现在把网络请求放到User类里,解析后直接赋值给Wor,TableView就能拿到正确的数据,自然就能展示内容了。
内容的提问来源于stack exchange,提问作者Mika
相关产品推荐
相关产品推荐

