[英]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 currentMealPlan
和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
並將每個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.