【问题标题】:SwiftUI ObservedObject not updating parent viewSwiftUI ObservedObject 不更新父视图
【发布时间】:2021-07-21 10:14:43
【问题描述】:

我有 2 个模型:Bag 和 Food。一个袋子包含 1 个食物。食物有名字。

我正在尝试将 Food.name 属性与父视图 (BagView) 中显示的 TextField 和子视图中显示的另一个 TextField (食物视图)。

  • 当我编辑父级的文本字段时,更改会显示在机器人视图中。
  • 当我编辑子文本字段时,更改不显示在父视图中。为什么?

这是我的示例代码:

class Bag: ObservableObject {
    @Published var food: Food
    
    init(food: Food) {
        self.food = food
    }
}

class Food: ObservableObject {
    @Published var name: String
    
    init(name: String) {
        self.name = name
    }
}

struct BagView: View {
    @ObservedObject var bag: Bag
    
    var body: some View {
        VStack {
            TextField("Placeholder 1", text: $bag.food.name)
            FoodView(food: bag.food)
        }
    }
}

struct FoodView: View {
    @ObservedObject var food: Food
    
    var body: some View {
        TextField("Placeholder 2", text: $food.name)
    }
}

【问题讨论】:

    标签: swift swiftui observableobject


    【解决方案1】:

    要在两个视图之间传递数据,您需要将Binding 用于FoodView。

    struct BagView: View {
        @ObservedObject var bag: Bag
    
        var body: some View {
            VStack {
                TextField("Placeholder 1", text: $bag.food.name)
                FoodView(food: $bag.food)
            }
        }
    }
    
    struct FoodView: View {
        @Binding var food: Food
        
        var body: some View {
            TextField("Placeholder 2", text: $food.name)
        }
    }
    

    回答您的评论,我建议添加一个额外的视图/包装器来预览Binding。

    附:顺便说一句,如果您打算将Food 用作Bag 视图模型的一部分,则无需使用已发布属性使其类。结构就够了。

    struct Food {
        var name: String
    }
    

    【讨论】:

    • 谢谢。我注意到对 Food 使用 struct 而不是 class 的唯一缺点是编辑器预览不适用于 FoodView:例如,如果我将 2 个 TextField 与 $food.name 放在一起,它们不会保持同步。
    • 可能您使用“常量”来预览绑定。尝试实现一个 View Wrapper。我在答案中添加了代码。
    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 2020-07-12
    • 2021-02-17
    • 2020-05-02
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多