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

Swift 4解析未知根名称JSON并适配TableView

处理动态分类的TableView实现方案

这个动态分类的需求其实很常见,核心思路就是把后端生成的动态JSON结构转成TableView能直接适配的数据源,让所有UI展示逻辑都依赖这个动态数据源——这样不管后续后端新增或修改分类,前端代码都不用大改。我给你一步步拆解实现:

第一步:解析JSON并转换为适配TableView的数据源结构

你的JSON是键为分类名称,值为对应条目数组的结构,直接用字典的话不太方便TableView的分区/行处理,所以我们先把它转成一个数组,每个元素包含「分类名」和「该分类下的条目列表」。

用Swift举个例子(Objective-C思路完全一致,只是语法不同):
首先定义一个条目模型来对应JSON里的每个条目:

struct CategoryItem: Codable {
    let name: String
    let url: String
    // 因为JSON里的键是大写的URL,所以用CodingKeys做个映射
    enum CodingKeys: String, CodingKey {
        case name
        case url = "URL"
    }
}

然后解析JSON并转换结构:

// 假设jsonString是你从后端拿到的JSON字符串
if let jsonData = jsonString.data(using: .utf8) {
    do {
        // 先解码成[String: [CategoryItem]]类型,完全匹配你的JSON结构
        let categoryDict = try JSONDecoder().decode([String: [CategoryItem]].self, from: jsonData)
        // 把字典转成数组,每个元素封装分类名和对应条目
        self.categories = categoryDict.map { categoryName, items in
            ["categoryName": categoryName, "items": items]
        }
        // 更新TableView展示
        tableView.reloadData()
    } catch {
        print("解析JSON出错:\(error.localizedDescription)")
    }
}

这里的categories是我们用来存数据源的数组,你可以定义成[[String: Any]]类型,追求规范的话也可以再定义一个Category结构体来封装。

第二步:实现UITableView的数据源/代理方法

现在所有的分区、行、表头都完全依赖动态的categories数组,不管后端怎么改分类,这些方法都不用动:

  1. 返回分区数(就是分类的总数量):
func numberOfSections(in tableView: UITableView) -> Int {
    return categories.count
}
  1. 设置分区表头标题:
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return categories[section]["categoryName"] as? String
}
  1. 返回每个分区的行数(对应分类下的条目数量):
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let items = categories[section]["items"] as? [CategoryItem] ?? []
    return items.count
}
  1. 配置每个Cell的内容:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellIdentifier", for: indexPath)
    // 获取当前行对应的条目
    let items = categories[indexPath.section]["items"] as? [CategoryItem] ?? []
    let currentItem = items[indexPath.row]
    // 给Cell赋值,这里可以根据你的UI需求调整
    cell.textLabel?.text = currentItem.name
    cell.detailTextLabel?.text = currentItem.url
    return cell
}

第三步:应对分类的新增/变更

以后后端新增或修改分类时,只要重新请求JSON,重复第一步的解析转换流程,然后调用tableView.reloadData(),TableView就会自动更新分区和内容,完全不需要修改UI相关的代码。

这样就完美解决了动态分类的问题,核心就是让数据源完全动态化,TableView的所有展示逻辑都基于这个动态数据源来实现~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:39:50