【问题标题】:SwiftUI - ObservableObject doesn't cause updateSwiftUI - ObservableObject 不会导致更新
【发布时间】:2020-09-24 21:11:21
【问题描述】:

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

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 上没有任何变化,视图也不会刷新以反映新数据。

(当我重新分配所有者变量时,没有任何事情发生)

【问题讨论】:

    标签: swift xcode swiftui state combine


    【解决方案1】:

    每次需要重绘/重新创建视图时,都会创建并初始化一个新的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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-11
      • 2021-10-14
      • 1970-01-01
      • 2021-03-11
      • 2021-02-27
      • 2021-11-29
      • 2020-12-05
      • 1970-01-01
      相关资源
      最近更新 更多