SwiftUI ObservedObject 不更新父视图
SwiftUI ObservedObject not updating parent view
我有 2 个模型:Bag 和 Food。一个袋子包含 1 个食物。食物有名字。
我正在尝试将 Food.name 属性 与父视图中显示的 TextField 绑定(BagView) 和子视图中显示的另一个 TextField (FoodView).
- 当我编辑父项的文本字段时,更改会显示在 bot 视图中。
- 当我编辑子项的文本字段时,更改未显示在父视图中。为什么?
这是我的示例代码:
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)
}
}
要在两个视图之间传递数据,您需要为 FoodView
使用 Binding
。
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
。
P.s。顺便说一句,如果您要使用 Food
作为 Bag
视图模型的一部分,则不需要使用 Published 属性使其 class。结构就够了。
struct Food {
var name: String
}
我有 2 个模型:Bag 和 Food。一个袋子包含 1 个食物。食物有名字。
我正在尝试将 Food.name 属性 与父视图中显示的 TextField 绑定(BagView) 和子视图中显示的另一个 TextField (FoodView).
- 当我编辑父项的文本字段时,更改会显示在 bot 视图中。
- 当我编辑子项的文本字段时,更改未显示在父视图中。为什么?
这是我的示例代码:
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)
}
}
要在两个视图之间传递数据,您需要为 FoodView
使用 Binding
。
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
。
P.s。顺便说一句,如果您要使用 Food
作为 Bag
视图模型的一部分,则不需要使用 Published 属性使其 class。结构就够了。
struct Food {
var name: String
}