SwiftUI点击列表项跳转详情页时传递crystals[key]数据的方法
SwiftUI 列表跳转详情页传值实现方案
核心修改点
只读展示的详情页不需要复杂的状态绑定,直接用普通属性接收数据即可,分两步修改:
- 给
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("水晶详情") } }
- 在
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
相关产品推荐
相关产品推荐

