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数组,不管后端怎么改分类,这些方法都不用动:
- 返回分区数(就是分类的总数量):
func numberOfSections(in tableView: UITableView) -> Int { return categories.count }
- 设置分区表头标题:
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return categories[section]["categoryName"] as? String }
- 返回每个分区的行数(对应分类下的条目数量):
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let items = categories[section]["items"] as? [CategoryItem] ?? [] return items.count }
- 配置每个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
相关产品推荐
相关产品推荐

