[英]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.