如何在SwiftUI预览中预设字典以正常显示LazyVGrid?
解决方法
当然可以在Preview中初始化字典,只需要调整代码结构让视图的数据源支持外部传入,就能独立在预览中提供测试数据,无需依赖应用初始化流程。
步骤1:重构视图,将字典作为参数传入
把全局的choices变量改为PickANumber视图的属性,通过初始化方法传入,这样数据源就可以灵活替换:
struct PickANumber: View { let choices: [String: [Int]] let columns: [GridItem] // 初始化方法,支持传入自定义字典和列配置 init(choices: [String: [Int]], columns: [GridItem]) { self.choices = choices self.columns = columns } // 也可以提供默认参数,方便正常使用 init() { self.choices = ["firstRound": [1,2,3,4,5,6,7,8,9,10]] self.columns = Array(repeating: GridItem(.flexible()), count: 3) } var body: some View { VStack { LazyVGrid(columns: columns) { // 用可选绑定替代强制解包,避免崩溃风险 if let firstRoundNumbers = choices["firstRound"] { ForEach(firstRoundNumbers, id: \.self) { number in Text("\(number)") .padding(.top, 10) } } } } } }
步骤2:在Preview中传入测试数据
现在可以直接在Preview里初始化测试用的字典,实时预览网格效果:
#Preview { PickANumber( choices: ["firstRound": [1,2,3,4,5,6,7,8,9,10]], columns: Array(repeating: GridItem(.flexible()), count: 4) // 可直接调整列数测试 ) }
额外优化点
原代码中的choices["firstRound"]!强制解包存在崩溃风险,改用if let可选绑定可以让代码更健壮,即使字典中没有firstRound键,视图也能正常显示(不会崩溃)。
调整后,你可以直接在Preview里修改字典内容、网格列数或样式,实时查看效果,无需启动调试器等待应用初始化。
内容的提问来源于stack exchange,提问作者Bartender1382
相关产品推荐
相关产品推荐

