You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:27:25