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

