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

SwiftUI解析JSON事件后视图空白 数据未加载问题求助

问题根因

  1. 日期解析失败:你定义的jsonDateFormatter未指定本地化格式,当系统语言非英文时,无法识别JSON中November这类英文月份字符串,导致JSON解码直接返回空数组,后续没有数据可渲染。
  2. ViewModel声明错误:在SwiftUI视图中自行初始化的ObservableObject对象需要使用@StateObject修饰,你用的@ObservedObject仅适用于外部传入的实例,视图重绘时可能会导致ViewModel被意外销毁重建,数据丢失。
  3. 错误捕获缺失:JSON读取解码逻辑全用try?静默吞掉了所有错误,你无法感知到解析失败的问题,也没法快速定位问题。

修复方案

1. 给日期Formatter指定固定本地化

修改Event扩展中的jsonDateFormatter定义,添加en_US_POSIX本地化适配,保证不管系统是什么语言都能正确解析英文日期:

public static var jsonDateFormatter: DateFormatter = {
    let formatter = DateFormatter()
    // 新增这一行,指定固定本地化适配英文日期
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.dateFormat = AppConstants.jsonDataFormat
    return formatter
}()

2. 修正ViewModel的属性修饰符

将ContentView中ViewModel的声明从@ObservedObject改为@StateObject:

@StateObject var viewModel: ViewModel = ViewModel()

3. 补充错误日志方便排查

修改Bundle扩展的JSON读取方法,打印错误信息避免静默失败:

public extension Bundle {
    func eventJsonData(fileName: String) -> [Event]? {
        guard let url = self.url(forResource: fileName, withExtension: "json") else {
            print("错误:找不到\(fileName).json文件,请确认文件已加入项目目标")
            return nil
        }
        do {
            let data = try Data(contentsOf: url)
            return try JSONDecoder().decode([Event].self, from: data)
        } catch {
            print("错误:数据解析失败 \(error.localizedDescription)")
            return nil
        }
    }
}

可选优化:避免强制解包

修改ContentView中读取分组数据的逻辑,去掉强制解包避免异常崩溃:

ForEach(viewModel.sections[header] ?? []) { event in

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:18:05