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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:45:05