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

SwiftUI点击列表项跳转详情页时传递crystals[key]数据的方法

SwiftUI 列表跳转详情页传值实现方案

核心修改点

只读展示的详情页不需要复杂的状态绑定,直接用普通属性接收数据即可,分两步修改:

  1. 给CrystalView新增常量属性接收传入的水晶数据
struct CrystalView: View {
    // 接收父视图传入的水晶模型,只读场景不需要加任何属性包装器
    let crystal: Crystal
    
    var body: some View {
        // 示例详情布局,可根据需求自行替换
        Form {
            Section("基础信息") {
                Text("成分:\(crystal.composition)")
                Text("形成方式:\(crystal.formation)")
                Text("颜色:\(crystal.colour)")
            }
            Section("形而上学属性") {
                ForEach(crystal.metaphysical, id: \.self) { attr in
                    Text(attr)
                }
            }
        }
        .navigationTitle("水晶详情")
    }
}
  1. 在ContentView的跳转逻辑中,安全取出对应key的水晶实例传入即可
// 把原来List容器内的ForEach部分替换为以下代码
List {
    ForEach(Array(crystals.keys), id:\.self) { key in
        // 字典取值为可选型,先做安全解包避免key不存在导致崩溃
        if let targetCrystal = crystals[key] {
            NavigationLink(destination: CrystalView(crystal: targetCrystal)) {
                Text(key)
            }
        }
    }
}
.onAppear(perform: loadData)

补充说明

  • 跨页面只读传值是SwiftUI最轻量的传值场景,不需要使用@State/@Binding/ObservableObject:只有当子视图需要反向修改父视图的状态时,才需要用到@Binding;需要跨多页面共享全局状态时,才需要用ObservableObject。
  • 之前在CrystalView里用@State遇到障碍,本质是@State是当前视图私有的状态源,设计上就不适合作为跨视图传值的载体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:21:46