首页 > 解决方案 > 如何将数据从一个 SwiftUI 视图文件传递到另一个?

问题描述

基本要点是我正在构建一个膳食计划应用程序。我是 Swift 和 SwiftUI 的新手,这是我的第一个项目,所以我可能犯了一个菜鸟错误大声笑基本上我想将当前索引(这是一天的数据对象,它是饭菜)传递给 DailyMealPlan 视图我点击相应的卡片。当我将 currentDay 变量传递给视图时,我没有收到错误,但在第二个视图文件中,我不确定如何处理该数据。我不断收到“CurrentMealPlan 不在范围内”的错误消息。我了解范围的工作原理,并且我怀疑在将数据传递到第二个视图时我只是遗漏了一些东西。

ForEach 代码

ForEach(CurrentMealPlan.indices) { index in
                                    
  let currentDay = CurrentMealPlan[index]
    NavigationLink(
      destination: DailyMealPlan(DailyMealPlan: currentDay))
    {                                  
      MealPlanCard(
       Day: "\(CurrentMealPlan[index].DayTitle)",
       Breakfast: "\(CurrentMealPlan[index].Breakfast)",
       Lunch: "\(CurrentMealPlan[index].Lunch)",
       Dinner: "\(CurrentMealPlan[index].Dinner)"
      )
    }
}

DailyMealPlan 视图

struct DailyMealPlan: View {
    
    var DailyMealPlan: Day = CurrentMealPlan[index]
    
    var body: some View {
    
        ZStack {
            ScrollView {
                VStack {
                   
                    SingleMealCard(Meal: "Breakfast", CalCount: 500, MealInfo: "Meal info here")
                    
                    SingleMealCard(Meal: "Lunch", CalCount: 500, MealInfo: "Meal info here")
                    
                    SingleMealCard(Meal: "Dinner", CalCount: 500, MealInfo: "Meal info here")
                }
            }
        }
    }
}

当前膳食计划模型

struct Day: Hashable {
    var id: Int
    var Date: String
    var DayTitle: String
    var Breakfast: String
    var Lunch: String
    var Dinner: String
    
    
    init(id:Int=0,Date:String="",DayTitle:String="",Breakfast:String="",Lunch:String="",Dinner:String="") {
        self.id  = id
        self.Date = Date
        self.DayTitle = DayTitle
        self.Breakfast = Breakfast
        self.Lunch = Lunch
        self.Dinner = Dinner
    }
}

let CurrentMealPlan: [Day] = [
    Day(
        id: 0,
        DayTitle: "Sunday",
        Breakfast:"Oatmeal",
        Lunch: "Sandwich",
        Dinner: "Cheeseburger with Fries"
    )
]

标签: iosswiftswiftuiparameter-passing

解决方案


让我们来看看你的代码。首先,您CurrentMealPlan在父视图中声明了数组。它可能看起来像这样:

@State var CurrentMealPlan = [Day]()

注意:正如jnpdx 所评论的,您应该将属性名称小写,例如var currentMealPlanand var dailyMealPlan。此外,您不应该DailyMealPlan视图和DailyMealPlan属性使用相同的名称......这非常令人困惑。

你的代码是正确的。然后,您循环CurrentMealPlan,并希望将每个元素传递给DailyMealPlan视图:

DailyMealPlan(DailyMealPlan: currentDay))

这也完全没问题。那么CurrentMealPlan is not in scope错误从何而来?就是这一行:

var DailyMealPlan: Day = CurrentMealPlan[index] /// NO!

请记住,您CurrentMealPlan在父视图中声明,而不是DailyMealPlan视图。这意味着DailyMealPlan视图无法访问CurrentMealPlan

但是,DailyMealPlan视图不需要访问CurrentMealPlan. 回到父视图,您已经在循环遍历CurrentMealPlan并将每个视图传递currentDayDailyMealPlan视图。

因此,您需要做的就是定义DailyMealPlan属性的类型:

struct DailyMealPlan: View {
   var DailyMealPlan: Day /// here!
   ...
}

这让编译器知道var DailyMealPlan接受一个Day.


推荐阅读