簡體   English   中英

修改 ObservableObject 中的列表對象后,我的視圖沒有更新

[英]My view doesn't update after modifying an object of a list inside an ObservableObject

我是 SwiftUI 的新手。 想象一下,我正在為一家商店構建一個應用程序。 我有一個產品詳細信息列表的視圖,以及兩個按鈕: Pin (添加到收藏夾)和Delete

我的問題是關於Pin按鈕(刪除按鈕工作正常)。 當我單擊它時,該圖標應該變為填充的 pin 圖標,而不是經典的 pin 圖標。 當我返回之前的視圖時,列出 5 個最新產品和固定產品(在兩個不同的部分),這個應該更新並將修改后的產品添加到固定產品列表中。

但是現在,圖釘圖標根本沒有改變(但是當我返回並再次進入產品詳細信息視圖時會改變)並且之前的視圖不會在固定的產品列表中顯示產品(而且我不能檢查它是否在我重新加載視圖時出現,因為我無法返回並再次進入該視圖,因為這是主視圖)。

我使用了一些標簽來表明視圖確實修改了商店和產品本身,如下所示。

因此,視圖具有產品本身的屬性和商店的屬性——控制所有產品列表的存儲庫:

struct DetailsView: View {
    @StateObject var store: Store
    @State var product: Product
    
    var body: some View {
        List {
            Section {
                VStack(alignment: .leading) {
                    Text(product.name)
                    
                    Text(product.brand)
                        .font(.subheadline)
                        .foregroundColor(.secondary)
                }
                .padding(.vertical, 6.0)
            } header: {
                Text("Product")
            }
            
            Section {
                Button {
                    product.pinned = !product.pinned
                } label: {
                    HStack {
                        if (product.pinned) {
                            Image(systemName: "pin.fill")
                            Text("Unpin")
                        } else {
                            Image(systemName: "pin")
                            Text("Pin")
                        }
                    }
                    .padding(.vertical, 6.0)
                }
                
                Button {
                    store.remove(product.id)
                } label: {
                    HStack {
                        Image(systemName: "trash")
                        Text("Delete")
                    }
                    .foregroundColor(.red)
                    .padding(.vertical, 6.0)
                }
            }
        }
        .navigationTitle(product.name)
        .navigationBarTitleDisplayMode(.inline)
    }
}

我的商店僅由一個屬性定義,即產品列表:

class Store: ObservableObject {
    @Published private var products: [Product]
    
    …
}

最后,產品由不同的屬性(名稱、品牌、固定)定義:

class Product: Identifiable {
    static private var count: Int = 0
    
    let id: Int
    @Published var name: String
    @Published var brand: String
    @Published var pinned: Bool = false
    
    …
}

回顧一下,我的問題是:我當前的視圖未更新(固定按鈕未更改),並且當我返回之前的視圖時未更新(該產品未出現在固定的產品列表中)。

有誰知道如何解決這個問題? 非常感謝。

附言
我之前顯示固定項目的視圖工作正常,除了這個。 我通過使用固定項目初始化我的商店來測試它,它們會出現。

你有2個問題:

1、點擊pin圖標時,當前頁面的pin狀態不會改變。

為什么? 因為 Product 類沒有繼承 ObservableObject 類,所以不能被觀察。 要修復它,請繼承 ObservableObject 類。

class Product: ObservableObject, Identifiable {
   static private var count: Int = 0

   let id: Int
   @Published var name: String
   @Published var brand: String
   @Published var pinned: Bool = false

   …
}

在您的 DetailsView 中,記得觀察產品:

struct DetailsView: View{
   @ObeservedObject product: Product
   ...
}

2、在當前頁面點擊pin不會改變你之前的頁面。

原因是雖然Store類是observabledObject,也就是說發布的屬性“products”被別人觀察到了,但是數組“products”的對象是“product”,是一個類。

所以實際上數組“products”包含一些指向“product”的指針。 即使像“pined”這樣的產品屬性發生變化,指針(地址)也不會改變。 所以當有人觀察發布的“產品”時,他會說“哦,什么都沒發生,不需要刷新視圖”。

要修復它,在您之前的視圖中,您應該觀察產品,而不是商店。

暫無
暫無

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

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