Swift 合并Firebase同步数组并排序填充UITableView问题求助
核心实现思路
将三个下标对应的关联属性打包为独立的单条数据模型,排序时整条数据同步移动,不会破坏对应关系。
实现步骤
1. 定义单条赛事数据结构体
// 单条赛事记录模型,包含所有关联属性 struct SportEvent { let name: String let timeString: String let date: Timestamp }
2. 新增表格数据源属性
在你的ViewController中新增合并后的数据存储数组,表格直接基于该数组渲染:
var eventList: [SportEvent] = []
3. 实现数组合并方法arrayMasher
func arrayMasher() { // 安全取值,同时校验三个数组长度一致,避免下标越界 guard let record = rSelectedRecord.first, let timeArray = record.rSyncTimeStringArray, let dateArray = record.rSyncDateArray, let nameArray = record.rSyncEventNameArray, timeArray.count == dateArray.count, dateArray.count == nameArray.count else { return } // 打包关联数据 eventList.removeAll() for i in 0..<timeArray.count { let event = SportEvent( name: nameArray[i], timeString: timeArray[i], date: dateArray[i] ) eventList.append(event) } // 首次加载默认排序 sortEvents(by: 0) resultsTable.reloadData() }
4. 实现分段控制排序逻辑
// 分段控制值变化时触发,需要在Storyboard中关联分段控制的valueChanged事件 @IBAction func segmentValueChanged(_ sender: UISegmentedControl) { sortEvents(by: sender.selectedSegmentIndex) resultsTable.reloadData() } // 按分段选中项执行不同排序规则 func sortEvents(by segmentIndex: Int) { switch segmentIndex { case 0: // 示例规则1:按时间正序排列(时间早的在前) eventList.sort { $0.date.seconds < $1.date.seconds } case 1: // 示例规则2:按时间倒序排列(时间晚的在前) eventList.sort { $0.date.seconds > $1.date.seconds } default: break } }
5. 修改TableView数据源方法
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return eventList.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "rCell", for: indexPath) as! ResultTableViewCell let currentEvent = eventList[indexPath.row] cell.rEvent.text = currentEvent.name cell.rEventTime.text = currentEvent.timeString return cell }
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

