SwiftUI解析JSON事件后视图空白 数据未加载问题求助
问题根因
- 日期解析失败:你定义的
jsonDateFormatter未指定本地化格式,当系统语言非英文时,无法识别JSON中November这类英文月份字符串,导致JSON解码直接返回空数组,后续没有数据可渲染。 - ViewModel声明错误:在SwiftUI视图中自行初始化的
ObservableObject对象需要使用@StateObject修饰,你用的@ObservedObject仅适用于外部传入的实例,视图重绘时可能会导致ViewModel被意外销毁重建,数据丢失。 - 错误捕获缺失: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
相关产品推荐
相关产品推荐

