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

UITableView无法从API调用获取数据 列表显示为空问题求助

问题根因

你修改行数为10时可以正常渲染自定义cell,说明cell注册、tableView基础配置逻辑无问题,空列表核心原因是 vehicles 数组为空/数据未生效,常见触发点为数据请求异常、解析失败、未主动刷新UI三类。

解决步骤

1. 确认数据返回后在主线程刷新UITableView

URLSession的网络请求回调默认在后台线程执行,你拿到数据赋值给vehicles后,必须手动切换到主线程调用表格刷新方法,否则UI不会同步更新。
ViewController中调用接口的代码示例:

APICaller.shared.getVehicles(for: "你的业务ID", IMEI: 你的IMEI数值) { [weak self] result in
    guard let self = self else { return }
    switch result {
    case .success(let vehicles):
        // 赋值数据源
        self.vehicles = vehicles
        // 切换主线程刷新表格
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    case .failure(let error):
        // 新增错误日志打印,排查是否是请求/解析失败
        print("接口请求失败,错误类型:\(error)")
    }
}

2. 修正JSON解析逻辑

当前解析配置存在字段不匹配风险:

  • 你设置了decoder.keyDecodingStrategy = .convertFromSnakeCase,该策略仅支持将下划线格式的JSON键(如plate_number)转换为小驼峰属性名(如plateNumber)
  • 你的Vehicles结构体属性均为首字母大写格式(Plate/Speed等),若后端返回的JSON键也为首字母大写,该解析策略会导致字段匹配失败,最终返回空数据
    修正方案:
    先删除convertFromSnakeCase配置,或新增CodingKeys手动映射字段,同时可打印原始返回数据确认结构:
// 解析前新增打印,确认后端返回的JSON字段与格式
print("接口返回原始数据:\(String(data: data, encoding: .utf8) ?? "无数据")")
do {
    let decoder = JSONDecoder()
    // 暂时移除snakeCase转换策略,匹配首字母大写的字段名
    // decoder.keyDecodingStrategy = .convertFromSnakeCase
    let vehicles = try decoder.decode([Vehicles].self, from: data)
    completed(.success(vehicles))
} catch {
    // 新增解析错误打印,定位具体解析失败原因
    print("JSON解析错误:\(error)")
    completed(.failure(.invalidData))
}

3. 修正Cell数据赋值逻辑

当前cell.configure()为无参调用,未将对应位置的车辆数据传入Cell,即使列表加载成功也无法展示业务数据:
首先修改MyCustomCell1的配置方法:

func configure(with vehicle: Vehicles) {
    // 给Cell内的各个标签赋值
    plateLabel.text = vehicle.Plate
    speedLabel.text = "\(vehicle.Speed)"
    driverLabel.text = vehicle.Driver
    // 其余字段依次赋值
}

修改tableView的数据源方法:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "monitorimiCell", for: indexPath) as! MyCustomCell1
    // 传入当前行对应的车辆数据
    cell.configure(with: vehicles[indexPath.row])
    return cell   
}

4. 排查网络权限与参数配置

  • 你的接口地址为HTTP协议,iOS默认禁止HTTP明文请求,需要在Info.plist中新增NSAppTransportSecurity配置,开启NSAllowsArbitraryLoads权限
  • 当前getVehicles方法中的接口参数为硬编码,未使用传入的id和IMEI参数,确认是否符合你的业务逻辑要求

内容的提问来源于stack exchange,提问作者user17416997

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:45:07