SwiftUI - ObservableObject 不会导致更新
SwiftUI - ObservableObject doesn't cause update
我有一个名为 SocialMealplan 的 class,如下所示:
public class SocialMealplan : Identifiable, ObservableObject {
public var id : String {
return owner.id
}
@Published public var owner : YKUser
@Published public var mealplan : Mealplan
init(owner : YKUser, mealplan : Mealplan) {
self.owner = owner
self.mealplan = mealplan
}
}
然后我有以下代码:
struct MealPlanView: View {
@ObservedObject var currentMealplan: SocialMealplan = SocialMealplan(owner: YKUser.none, mealplan: Mealplan.none)
var body: some View {
/* ... */
ForEach(self.currentMealplan.mealplan.meals, id: \.self) { (meal) in
VStack {
NavigationLink(destination: SelectRecipeView(completion: self.updatedMealplan, date: meal.date)) {
MealplanRow(meal: .constant(meal))
}
}
}.onAppear {
self.refreshMealplan()
}
/* ... */
}
func refreshMealplan() {
// Get the mealplan from the server
self.currentMealplan.mealplan = newMealplan
}
}
问题是,当我 运行 这段代码获得膳食计划时,但当它尝试分配变量时没有任何反应。调用了 refreshMealplan 并分配了变量,但 UI 上没有任何变化,并且视图不会刷新以反映新数据。
(当我重新分配 owner 变量时也没有任何反应)
每次视图需要 redrawn/recreated 时,都会创建并初始化一个新的 SocialMealPlan
对象 currentMealPlan
。因此,一个对象触发了更新(通过分配给已发布的变量之一),但新更新的视图引用了它自己新初始化的 currentMealPlan
.
副本
选项 1:将 currentMealPlan 设为 @StateObject
(这样代表一个州的一个副本将被保留和引用)。即@StateObject var currentMealplan = SocialMealplan(owner: YKUser.none, mealplan: Mealplan.none)
选项 2:或者保留 @ObservedObject,但在视图之前和视图之外创建它。但是,如果其他视图也需要引用currentMealPlan
,请在视图之前创建一个并将其作为环境变量传递。即 MealPlanView().environmentObject(currentMealPlan)
然后在视图中 @EnvironmentObject var currentMealPlan: SocialMealPlan
我有一个名为 SocialMealplan 的 class,如下所示:
public class SocialMealplan : Identifiable, ObservableObject {
public var id : String {
return owner.id
}
@Published public var owner : YKUser
@Published public var mealplan : Mealplan
init(owner : YKUser, mealplan : Mealplan) {
self.owner = owner
self.mealplan = mealplan
}
}
然后我有以下代码:
struct MealPlanView: View {
@ObservedObject var currentMealplan: SocialMealplan = SocialMealplan(owner: YKUser.none, mealplan: Mealplan.none)
var body: some View {
/* ... */
ForEach(self.currentMealplan.mealplan.meals, id: \.self) { (meal) in
VStack {
NavigationLink(destination: SelectRecipeView(completion: self.updatedMealplan, date: meal.date)) {
MealplanRow(meal: .constant(meal))
}
}
}.onAppear {
self.refreshMealplan()
}
/* ... */
}
func refreshMealplan() {
// Get the mealplan from the server
self.currentMealplan.mealplan = newMealplan
}
}
问题是,当我 运行 这段代码获得膳食计划时,但当它尝试分配变量时没有任何反应。调用了 refreshMealplan 并分配了变量,但 UI 上没有任何变化,并且视图不会刷新以反映新数据。
(当我重新分配 owner 变量时也没有任何反应)
每次视图需要 redrawn/recreated 时,都会创建并初始化一个新的 SocialMealPlan
对象 currentMealPlan
。因此,一个对象触发了更新(通过分配给已发布的变量之一),但新更新的视图引用了它自己新初始化的 currentMealPlan
.
选项 1:将 currentMealPlan 设为 @StateObject
(这样代表一个州的一个副本将被保留和引用)。即@StateObject var currentMealplan = SocialMealplan(owner: YKUser.none, mealplan: Mealplan.none)
选项 2:或者保留 @ObservedObject,但在视图之前和视图之外创建它。但是,如果其他视图也需要引用currentMealPlan
,请在视图之前创建一个并将其作为环境变量传递。即 MealPlanView().environmentObject(currentMealPlan)
然后在视图中 @EnvironmentObject var currentMealPlan: SocialMealPlan