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

Swift中基于For-Each循环创建多Table View Cell的实现疑问

解决航班数据TableView展示与跳转的最简方案

核心问题修复

1. 解决JSON解析数据被覆盖的问题

你之前应该是用单个变量存储解析后的航班数据,遍历赋值时会不断覆盖旧数据,最终只剩最后一条。直接改成数组存储所有航班数据即可:

// 把单个模型变量换成数组,直接用FlightData无需额外FlightModel
var flights: [FlightData] = []

func parseJSON(_ data: Data) {
    do {
        let decodedResponse = try JSONDecoder().decode(YourRootAPIResponse.self, from: data)
        // 遍历所有航班数据,逐个添加到数组
        for flight in decodedResponse.arrivals {
            flights.append(flight)
        }
        // 切回主线程刷新TableView
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    } catch {
        print("JSON解析失败: \(error)")
    }
}

2. 修复TableView仅显示一行的问题

把numberOfRowsInSection的返回值改成数组的元素数量:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return flights.count
}

关于FlightModel与FlightData的疑问

完全可以直接用包含完整字段的FlightData结构体作为数据源,没必要额外封装FlightModel——除非你需要对原始API数据做字段裁剪、格式转换(比如把时间戳转成Date对象),这种场景下再考虑封装模型。如果只是做数据展示和传递,直接用FlightData是最简方案。

实现Cell点击跳转

1. 注册TableViewCell(自定义Cell场景)

// 在viewDidLoad中注册
tableView.register(FlightCell.self, forCellReuseIdentifier: "FlightCell")
// 若用XIB创建Cell,替换成下面的代码
// tableView.register(UINib(nibName: "FlightCell", bundle: nil), forCellReuseIdentifier: "FlightCell")

2. 填充Cell内容

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "FlightCell", for: indexPath) as! FlightCell
    let currentFlight = flights[indexPath.row]
    // 根据你的UI需求填充数据,比如航班号、到达时间等
    cell.flightNumLabel.text = currentFlight.ident
    cell.arrivalTimeLabel.text = currentFlight.scheduledArrival
    return cell
}

3. 处理Cell点击跳转逻辑

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    let selectedFlight = flights[indexPath.row]
    // 初始化详情页控制器
    let detailVC = FlightDetailViewController()
    // 传递完整航班数据到详情页
    detailVC.targetFlight = selectedFlight
    // 导航栈跳转(若当前控制器在导航控制器中)
    navigationController?.pushViewController(detailVC, animated: true)
    // 若用模态跳转,替换成下面的代码
    // present(detailVC, animated: true)
}

额外优化提示

  • 网络请求务必放在后台线程执行,解析完成后切回主线程刷新UI
  • 若API返回数据量较大,可考虑实现分页加载,避免一次性加载过多数据
  • 用Codable协议自动解码JSON,比手动解析更简洁且不易出错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:48:20