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
相关产品推荐
相关产品推荐

