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

如何创建可传递新创建/已有对象的navigationDestination导航链接?

解决NavigationDestination同时支持新建对象与已有对象的问题

你的代码核心逻辑没问题,但在navigationDestination的使用和Realm对象状态同步上可以优化,以下是修正后的实现:

修正代码

struct HomeView: View {
    @ObservedResults(Meal.self) var meals
    @State private var selectedMeal: Meal?
    
    var body: some View {
        NavigationStack {
            ScrollView {
                let columns = [GridItem(), GridItem(), GridItem()]
                LazyVGrid(columns: columns) {
                    // 新建餐食按钮
                    ZStack {
                        Circle()
                            .stroke(lineWidth: 8)
                        Image(systemName: "plus")
                    }
                    .padding()
                    .onTapGesture {
                        let newMeal = Meal()
                        $meals.append(newMeal)
                        selectedMeal = newMeal
                    }
                    
                    // 已有餐食列表
                    ForEach(meals) { meal in
                        MealCell(meal: meal)
                            .padding()
                            .contextMenu {
                                Button(role: .destructive) {
                                    $meals.remove(meal)
                                } label: {
                                    Text("删除")
                                }
                            }
                            .onTapGesture {
                                selectedMeal = meal
                            }
                    }
                }
            }
            // 标准的item绑定式导航目标
            .navigationDestination(item: $selectedMeal) { meal in
                MealView(meal: meal)
            }
            .navigationTitle("餐食")
        }
    }
}

关键优化点

  • 导航目标写法调整:改用navigationDestination(item:)而非绑定值的写法,这是SwiftUI 4+中处理可选对象导航的标准方式,能更稳定地识别Meal类型的导航触发。
  • Realm对象同步:新建Meal时先将其添加到@ObservedResults列表,再赋值给selectedMeal,确保Realm完成对象托管后再触发导航,避免状态不一致问题。
  • 冗余代码移除:删掉了没用的mealCreated状态变量,直接通过selectedMeal控制导航逻辑。

额外注意事项

确保你的Meal Realm模型遵循Identifiable(Realm对象默认实现该协议,但需要主键支持),如果还没设置主键,补充如下:

class Meal: Object, Identifiable {
    @Persisted(primaryKey: true) var id: UUID = UUID()
    // 其他业务属性...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:30:21