【发布时间】: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