首页 > 解决方案 > 如何在编辑模式下删除字典中的键值对?

问题描述

如果我想在编辑模式下删除列表中的数组项,似乎没有问题。但是当涉及到字典时,我根本无法删除该项目。

struct ExploringEditButton2: View {
    //    private var users = ["Paul", "Taylor", "Adele"]
            @State private var users = ["A": "1", "B": "2"]

            var body: some View {
                NavigationView {
                    List {
                        ForEach(Array(users.keys), id: \.self) { key in
                            Text(key)
                        }
                        .onDelete(perform: deleteOnKey)
                    }
                    .navigationBarItems(trailing: EditButton())
                }
            }

        func deleteOnKey(key: String, user: [String:String]){
                 user[key] = nil //Cannot assign through subscript: 'user' is a 'let' constant

            }

         func deleteListItem(at offsets: IndexSet) {
                print("offsets : \(offsets)")
                users.remove(atOffsets: offsets)
            }
}

知道这里出了什么问题吗?

更新答案:

我重写了 deleteListItem 函数。现在它起作用了。

         func deleteListItem(at offset: IndexSet) {
                print("offset \(offset) offset.first! : \(offset.first!)")
//                let key = Array(self.users.keys)[offset.first!]
            let key = Array(users.keys)[offset.first!]
                self.users.removeValue(forKey: key)
            }

标签: iosswiftuiswiftui-list

解决方案


这是工作解决方案。使用 Xcode 11.4 / iOS 13.4 测试

struct ExploringEditButton2: View {
    //    private var users = ["Paul", "Taylor", "Adele"]
    @State private var users = ["A": "1", "B": "2"]

    var body: some View {
        NavigationView {
            List {
                self.listContent(for: Array(users.keys))
            }
            .navigationBarItems(trailing: EditButton())
        }
    }

    private func listContent(for keys: [String]) -> some View {
        ForEach(keys, id: \.self) { key in
            Text(key)
        }
        .onDelete { indexSet in
            let key = keys[indexSet.first!]
            self.users.removeValue(forKey: key)
        }
    }
}

推荐阅读