【问题标题】:SwiftUI - Deleting items from a filtered listSwiftUI - 从过滤列表中删除项目
【发布时间】:2020-08-31 10:48:27
【问题描述】:

我有一个过滤列表,我需要使用 ForEach 的 .onDelete 方法删除项目。由于 delete(at offsets: IndexSet) 函数使用的是当前显示列表的索引,所以我需要准确地引用这个列表项的顺序。

不幸的是,当我想引用过滤的工具变量时,我收到以下错误:

不能对不可变值使用变异成员:“filteredTools”是一个只能获取的属性

知道如何解决这个问题吗?

谢谢!

struct ToolList: View {
    @EnvironmentObject var userData: UserData
    @State var showingFilter = false
    @State var editMode = EditMode.inactive

    var toolCategories: [String: [Tool]] {
        Dictionary(
            grouping: userData.tools,
            by: { $0.category }
        )
    }

    var filteredTools: [Tool] {
        var list = [Tool]()
        for category in self.userData.selectedToolCategories {
            if category.isSelected && self.toolCategories[category.name] != nil {
                list += self.userData.showFavoritesOnly ? self.toolCategories[category.name]!.filter { $0.isFavorite } : self.toolCategories[category.name]!
            }
        }
        return list
    }

    var body: some View {
        NavigationView {
            List {
                ForEach(filteredTools) { tool in
                    NavigationLink(destination: ToolDetail(tool: tool).environmentObject(self.userData)) {
                        ToolRow(tool: tool)
                    }
                }
                .onDelete(perform: delete)
            }
            .navigationBarTitle(Text(NSLocalizedString("Tools", comment: "")))
            .navigationBarItems(
                leading: EditButton(),
                trailing: NavigationBar(showingFilter: self.$showingFilter, editMode: self.$editMode)
                    .environmentObject(userData)
            )
            .environment(\.editMode, $editMode)
            .sheet(isPresented: $userData.showingProfile) {
                ProfileHost()
                    .environmentObject(self.userData)
            }
            .sheet(isPresented: $showingFilter) {
                FilterView(isPresented: self.$showingFilter, categories: self.$userData.selectedToolCategories)
            }
        }
    }

    func delete(at offsets: IndexSet) {
        self.filteredTools.remove(atOffsets: offsets) // <-- this is where I get this error message: Cannot use mutating member on immutable value: 'filteredTools' is a get-only property
    }
}

【问题讨论】:

  • 尝试制作filteredTools@State(甚至使用@ObservedObject)。目前它是结构的属性,因此是不可变的。

标签: swiftui


【解决方案1】:

我通过在模型中而不是在视图中实现删除功能来解决它​​,传递实际显示(过滤)的列表来确定要删除的项目的 id 以及项目的索引:

private func onDelete(offsets: IndexSet) {
    userData.delete(from: filteredTools, offsets: offsets)
}

【讨论】:

    猜你喜欢
    • 2013-04-22
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2022-12-20
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多