SwiftUI-ObservableObject不会导致更新

时间:2020-09-24 21:11:21

标签: swift xcode swiftui state combine

我有一个名为SocialMealplan的类,如下所示:

const OtherBox = (props: BoxInferredProps) => (
  {/* TS won't complain that `props` doesn't have a `iAmNotTyped` property which is desired... */}
  <div style={{ backgroundColor: props.iAmNotTyped}}>{props.children}</div>
);

然后我有以下代码:

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
    }
}

问题是,当我运行此代码时,它将获得进餐计划,但是当它尝试分配变量时,则什么也没有发生。调用refreshMealplan并分配了变量,但是UI上没有任何更改,并且视图也没有刷新以反映新数据。

(当我重新分配所有者变量时,什么也没有发生)

1 个答案:

答案 0 :(得分:2)

每次需要重新绘制/重新创建视图时,都会创建并初始化一个新的SocialMealPlan对象currentMealPlan。因此,一个对象触发了更新(通过分配给已发布的var之一),但是新的更新视图引用了其自己的currentMealPlan新的新初始化副本。

选项1:将currentMealPlan设为@StateObject(这样就保留并引用了一个表示状态的副本)。即@StateObject var currentMealplan = SocialMealplan(owner: YKUser.none, mealplan: Mealplan.none)

选项2:或者保留@ObservedObject,但在视图之前和视图外部创建它。但是,如果其他视图也需要引用currentMealPlan,请在视图之前创建一个视图,并将其作为环境变量传递。即MealPlanView().environmentObject(currentMealPlan),然后在视图 @EnvironmentObject var currentMealPlan: SocialMealPlan