SwiftUI如何将静态数组从PreviewProvider传递到主类并解决数据为空问题
问题原因
你遇到的空数据问题核心原因是 PreviewProvider 仅为Xcode预览功能的专属代码块,仅在预览面板渲染时执行,App 正式运行时不会调用这部分代码,因此你写在预览内部的测试数组不会被加载到实际运行的主逻辑中。
解决方法
分两种常用场景处理:
场景1:数组为固定静态数据,不需要后续修改
可以直接给 ContentView 的参数设置默认值,无需使用 @Binding:
struct ContentView: View { // 直接定义默认数据源,不需要Binding let country: [CountryDetails] = [ .init(id: 1, City: "Mumbai", State: "Maharashtra", Country: "India" ), .init(id: 2, City: "Chennai", State: "Tamil Nadu", Country: "India" ), .init(id: 3, City: "Bengaluru", State: "Karnataka", Country: "India" ) ] var body: some View { NavigationView{ List{ ForEach(country) { country in Text(country.City) } } .navigationTitle("Country's Details") } } } // 预览部分不需要改动,原代码即可正常预览
场景2:后续需要修改数组内容,需保留Binding
需要在App的根入口层(即项目里的 xxxApp.swift 文件,带@main标记的结构体)定义数据源,传入到ContentView:
@main struct YourAppName: App { // 根层级定义全局可修改的数据源 @State private var countryArr: [CountryDetails] = [ .init(id: 1, City: "Mumbai", State: "Maharashtra", Country: "India" ), .init(id: 2, City: "Chennai", State: "Tamil Nadu", Country: "India" ), .init(id: 3, City: "Bengaluru", State: "Karnataka", Country: "India" ) ] var body: some Scene { WindowGroup { // 把数据源传入ContentView ContentView(country: $countryArr) } } }
改完之后你原来的预览代码依然可以正常使用,不会影响预览效果。
内容的提问来源于stack exchange,提问作者Arpit
相关产品推荐
相关产品推荐

