如何使用JSON文件填充iOS应用中的UITableView?
用本地JSON文件填充UITableView的完整指南
看起来你已经搞定了硬编码数据的基础逻辑,现在切换到JSON数据源其实很轻松,用Swift自带的Codable协议就能高效完成,我帮你一步步梳理清楚:
1. 对齐JSON结构与数据模型
首先确保你的JSON文件格式规范,比如我假设你的bonuses.json内容是这样的(可以根据实际需求调整):
[ { "title": "每日登录奖励", "desc": "登录即可获得50积分", "rewardValue": 50 }, { "title": "邀请好友奖励", "desc": "成功邀请1位好友得200积分", "rewardValue": 200 } ]
然后定义对应的Codable数据模型(建议把你代码里的Bonuses改成Bonus,避免复数命名混淆,统一命名更清晰):
struct Bonus: Codable { let title: String let desc: String let rewardValue: Int // 如果JSON的key和属性名不一致,用CodingKeys做映射,比如JSON里是"description",可以这么写: // enum CodingKeys: String, CodingKey { // case title, rewardValue // case desc = "description" // } }
2. 读取并解析本地JSON文件
在你的BonusTableViewController里添加一个加载JSON的方法,把解析后的数据存入数据源数组:
private func loadBonusesFromLocalJSON() { // 先获取JSON文件在Bundle中的路径 guard let jsonURL = Bundle.main.url(forResource: "bonuses", withExtension: "json") else { os_log("找不到本地JSON文件", log: OSLog.default, type: .error) return } do { // 读取文件数据 let jsonData = try Data(contentsOf: jsonURL) // 解析成Bonus数组 let decodedBonuses = try JSONDecoder().decode([Bonus].self, from: jsonData) // 替换原来的硬编码数据源 self.jBonuses = decodedBonuses // 如果你想统一用bonuses数组,就写self.bonuses = decodedBonuses // 解析完成后刷新表格 tableView.reloadData() } catch { os_log("JSON解析失败:%@", log: OSLog.default, type: .error, error.localizedDescription) } }
然后在viewDidLoad里调用这个方法,替换原来的硬编码数据初始化逻辑:
override func viewDidLoad() { super.viewDidLoad() // 移除原来的硬编码数组赋值,换成JSON加载方法 loadBonusesFromLocalJSON() }
3. 更新UITableView数据源方法
把原来依赖硬编码数组的数据源方法,改成用新的JSON解析数组:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return jBonuses.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // 假设你的cell重用ID是"BonusCell",且自定义了对应的cell类 guard let cell = tableView.dequeueReusableCell(withIdentifier: "BonusCell", for: indexPath) as? BonusTableViewCell else { fatalError("无法转换为自定义的BonusTableViewCell") } let currentBonus = jBonuses[indexPath.row] // 给cell的控件赋值 cell.titleLabel.text = currentBonus.title cell.descLabel.text = currentBonus.desc cell.rewardLabel.text = "\(currentBonus.rewardValue) 积分" return cell }
几个容易踩的坑
- JSON文件要加入Target:在Xcode里选中你的JSON文件,右侧检查器的
Target Membership要勾选你的应用target,否则Bundle找不到文件 - JSON格式要正确:必须用双引号包裹字符串,不能有多余的尾逗号,否则解析会直接报错
- 属性名要严格匹配:模型的属性名要和JSON的key完全一致(大小写敏感),不一致就用
CodingKeys做映射
内容的提问来源于stack exchange,提问作者DJFriar
相关产品推荐
相关产品推荐

