发布
社区首页 >问答首页 >SwiftUI:“动态列表与组”在更改`@Published`‘属性时未刷新

SwiftUI:“动态列表与组”在更改`@Published`‘属性时未刷新
EN

Stack Overflow用户
提问于 2019-11-12 11:20:40
回答 2查看 943关注 0票数 2

我试图在中创建一个SwiftUI动态分组列表,如果我更改标记为@已发布的内部ForEach的集合,则除非我转到另一个屏幕/工作表,否则UI中看不到更改。我不明白我所做的是正确的还是不正确的错误,关于“SwiftUI中的动态分组列表”这一主题的资源非常有限,所以我希望您能指出正确的方向。

这是我的设置:

型号:

代码语言:javascript
代码运行次数:0
复制
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]()
}

和观点

代码语言:javascript
代码运行次数:0
复制
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非常陌生。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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绑定上操作。

票数 2
EN

Stack Overflow用户

发布于 2022-03-10 14:07:07

在Swift中,类别和产品应该是一个结构。

这为您提供了值语义,这就是SwiftUI用于检测更改的内容。也就是说,对产品的更改被检测为对类别的更改,这被检测为对@Published项的更改,SwiftUI正在观察这些更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58817625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档