Swift 5中JSON响应返回的无序值如何在UITableView中正确展示
问题原因
- 核心原因:
MyCircleResponse.data是字典类型,Swift 中字典属于无序集合,你直接遍历字典键值对生成sections数组时,分组顺序每次请求都可能随机变化,最终导致UITableView分组展示顺序异常。 - 次要原因:你没有对每个分组内的充值记录做排序处理,同一分组下的消费记录顺序也可能不符合用户浏览习惯(通常默认要求最新记录排在最前)。
解决方案
你需要在接口返回数据转换为本地sections数组的阶段,分别对全部分组和分组内的单条充值记录做排序处理,可根据业务需求选择排序规则,以下是具体实现:
extension MyCircleViewController: MyCircleViewDelegate { func myCircleDidReceived(response: MyCircleResponse?) { if(response == nil){ lb_my_circle_total.text = "0" showErrorDialog(title: "No data found!", msg: nil, titleFullRed: true) }else{ lb_my_circle_total.text = "\(response!.data.count)" sections.removeAll() for (number , recharges) in response!.data { var rechargeHistories = [MyCircleSection.SingeRecharge]() for singleRecharge in recharges { rechargeHistories.append(MyCircleSection.SingeRecharge(amount: singleRecharge.amount, rechargeType : singleRecharge.rechargeType, create_at: singleRecharge.createdAt)) } // 1. 对当前分组内的充值记录按时间倒序排序,保证最新记录在前 rechargeHistories.sort { $0.create_at > $1.create_at } sections.append(MyCircleSection(number: number, recharges: rechargeHistories)) } // 2. 对全部分组排序,以下提供两种常用规则,二选一即可 // 规则A:按手机号升序排列 sections.sort { $0.number < $1.number } // 规则B:按分组内最新充值时间倒序排列(最近有消费的分组排在最前) /* sections.sort { sec1, sec2 in guard let time1 = sec1.recharges.first?.create_at, let time2 = sec2.recharges.first?.create_at else { return sec1.number < sec2.number } return time1 > time2 } */ self.tableView.reloadData() self.tableView.isHidden = false } } }
补充注意
如果后端返回的create_at是自定义格式的时间字符串,无法直接比较大小,需要先转成Date类型再做排序,示例代码:
// 全局初始化时间格式化器,配置和后端返回一致的格式 private let dateFormatter: DateFormatter = { let fmt = DateFormatter() fmt.dateFormat = "yyyy-MM-dd HH:mm:ss" // 替换为后端实际返回的时间格式 fmt.timeZone = TimeZone(abbreviation: "UTC") return fmt }() // 排序时转成Date比较 rechargeHistories.sort { guard let d1 = dateFormatter.date(from: $0.create_at), let d2 = dateFormatter.date(from: $1.create_at) else { return false } return d1 > d2 }
内容的提问来源于stack exchange,提问作者Md.Omar Faruq
相关产品推荐
相关产品推荐

