我试图在中创建一个SwiftUI动态分组列表,如果我更改标记为@已发布的内部ForEach的集合,则除非我转到另一个屏幕/工作表,否则UI中看不到更改。我不明白我所做的是正确的还是不正确的错误,关于“SwiftUI中的动态分组列表”这一主题的资源非常有限,所以我希望您能指出正确的方向。
这是我的设置:
型号:
class Product: Identifiable, ObservableObject {
let id = UUID()
var name: String
init(name: String) {
self.name = name
}
}
class Category: Identifiable, ObservableObject {
let id = UUID()
@Published var items = [Product]()
var categoryName = ""
}
class Categories: ObservableObject {
@Published var items = [Category]()
}
和观点
struct ProductListView: View {
@ObservedObject var categories: Categories = Categories()
var body: some View {
List {
ForEach(categories.items) { category in
Section(header: Text(category.categoryName)) {
ForEach(category.items) { item in
Text(item.name)
}
}
}
}
.listStyle(GroupedListStyle())
}
func appendProduct() {
let product = Product(name: self.$name.wrappedValue, quantity: 1, complated: false)
let basicCategory = "Generic"
let existingCategory = self.categories.items.filter({$0.categoryName == basicCategory}).first
if (existingCategory?.items != nil) {
// Changes here do not refresh the UI
existingCategory?.items.append(product)
} else {
let category = Category()
category.categoryName = basicCategory
category.items.append(product)
self.categories.items.append(category)
}
}
}
当我附加到Category
(existingCategory?.items.append(product)
)的项时,除非我使用导航或使用.sheet()
,否则UI不会被更新
有人知道这里出了什么问题吗?我对Swift和SwfitUI非常陌生。
发布于 2019-11-12 12:42:46
您的视图只是在观察categories
,因此只有对categories
的直接更改才会导致视图的重绘。
这就是为什么self.categories.items.append(Category())
总是会导致视图重绘,但existingCategory?.items.append(product)
不会。
existingCategory?.items.append(product)
只是向categories
类别元素中的一个添加元素,但类别元素仍然是相同的,因此在直接到观察到的categories
的地方没有更改。
你可以试试这个:
self.$categories.items[0].items.wrappedValue.append(product)
这也会导致视图的重绘,因为您直接在categories
绑定上操作。
发布于 2022-03-10 14:07:07
在Swift中,类别和产品应该是一个结构。
这为您提供了值语义,这就是SwiftUI用于检测更改的内容。也就是说,对产品的更改被检测为对类别的更改,这被检测为对@Published
项的更改,SwiftUI正在观察这些更改。
https://stackoverflow.com/questions/58817625
复制相似问题