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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:24:05