簡體   English   中英

如何將數據從一個 SwiftUI 視圖文件傳遞到另一個?

[英]How do I pass data from one SwiftUI view file to another?

基本要點是我正在構建一個膳食計划應用程序。 我是 Swift 和 SwiftUI 的新手,這是我的第一個項目,所以我可能犯了一個菜鳥錯誤lol 基本上我想將當前索引傳遞給 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"
    )
]

讓我們來看看你的代碼。 首先,您在父視圖中聲明了CurrentMealPlan數組。 它可能看起來像這樣:

@State var CurrentMealPlan = [Day]()

注意:正如jnpdx 所評論的,您應該小寫屬性名稱,例如var currentMealPlanvar 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並將每個currentDay傳遞到DailyMealPlan視圖。

因此,您需要做的就是定義DailyMealPlan屬性的類型:

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

這讓編譯器知道var DailyMealPlan接受了Day

我建議使用 MVVM 方法,每個屏幕視圖都應該有它自己的視圖模型(它應該是一個擴展基本視圖模型或協議的類),您在創建視圖時傳遞它。

在你的情況下,你應該有:

protocol BaseViewModel {
}

class DailyMealPlanViewModel: BaseViewModel {
 @Published var day: Day

}

在上面我還添加了@Published 的日期,因此任何更改都會刷新視圖,如果這一天永遠不會改變,您可以刪除@Published。

在您看來:

struct DailyMealPlan: View {
 @StateObject var viewModel: DailyMealPlanViewModel
 ...
 ...

導航時:

NavigationLink(
      destination: DailyMealPlan(viewModel: DailyMealPlanViewModel(day: currentDay))
    ...
    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM