簡體   English   中英

SwiftUI ObservedObject 不更新父視圖

[英]SwiftUI ObservedObject not updating parent view

我有 2 個模型: BagFood 一個袋子包含 1 個食物。 食物有一個名字。

我正在嘗試將Food.name屬性與父視圖 ( BagView ) 中顯示的 TextField 和子視圖 ( FoodView ) 中顯示的另一個 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)
    }
}

在此處輸入圖片說明

要在兩個視圖之間傳遞數據,您需要對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 在此處輸入圖片說明

Ps 順便說一下,如果您打算使用Food作為Bag視圖模型的一部分,則不需要使用 Published 屬性將其設置為類。 結構就夠了。

struct Food {
    var name: String
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM