如何创建可传递新创建/已有对象的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
相关产品推荐
相关产品推荐

