【问题标题】:How to delete an item in a swiftui list that consists of dynamic sections?如何删除由动态部分组成的 swiftui 列表中的项目?
【发布时间】:2019-09-01 18:33:54
【问题描述】:

假设我有一个 swiftui 视图显示按部门划分的员工列表,我如何删除一个部分中的项目? 同样的方式向左滑动删除uitableview中的行为。

import SwiftUI

struct ContentView: View {
    var data: [String : [String]] = ["DeptA": ["EmpA", "EmpB", "EmpC"], "DeptB": ["EmpD", "EmpE", "EmpF"]]

    var body: some View {
        NavigationView {

            List {
                ForEach(data.keys.map { String($0) }, id: \.self) { dept in
                    Section(header: Text(dept)) {
                        ForEach(self.data[dept]!, id: \.self) { emp in
                            Text(emp)
                        }.onDelete(perform: self.deleteEmp)
                    }
                }
            }
            .navigationBarTitle("Employees")
        }
    }

    private func deleteEmp(indexSet: IndexSet) {
        print(indexSet.first!)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

【问题讨论】:

  • 您可以关闭.onDelete,将要删除的索引集与部门或其他标识信息一起传递给self.deleteEmp
  • 终于找到了一个可行的解决方案,我觉得很愚蠢。谢谢。
  • 在你传递一个方法本身(而不是调用它)的地方,你总是可以传递一个闭包。它只是不会经常发生,因此并不明显同意

标签: swift swiftui


【解决方案1】:

从数据源中删除它:

struct ContentView: View {
    @State var dataSource = ["1", "2", "3", "4"]

    var body: some View {

        List(dataSource, id: \.self) { number in

            Text("Click Here to delete this row " + number)
                .onTapGesture {
                    let index = self.dataSource.firstIndex(of: number)!
                    self.dataSource.remove(at: index)
            }
        }
    }
}

更新 duo 到您的代码

您将数据源嵌套在两个ForEachs 中。第一个可以访问部分,第二个可以访问行。所以:

struct ContentView: View {
    var data: [String : [String]] = ["DeptA": ["EmpA", "EmpB", "EmpC"],
                                     "DeptB": ["EmpD", "EmpE", "EmpF"]]
    var sections: [String] { data.keys.map { $0 } }
    func rows(section: Int) -> [String] { data[sections[section]]! }

    var body: some View {
        NavigationView {

            List {
                ForEach(0..<sections.count, id: \.self) { section in
                    Section(header: Text(self.sections[section])) {
                        ForEach(self.rows(section: section), id: \.self) { emp in
                            Text(emp)
                        }.onDelete { row in
                            self.deleteEmp(section: section, row: row)
                        }
                    }
                }
            }.navigationBarTitle("Employees")
        }
    }

    private func deleteEmp(section: Int, row: IndexSet) {
        print("Section:", section)
        print("Row:", row.first!)
    }
}

请注意,我使用了一些辅助变量和函数。

【讨论】:

  • 列表包含部分,部分包含我要删除的单元格。我使用 onDelete 修饰符,但它为每个部分提供了相同的索引集,所以我不知道它是哪个部分。
  • 贴出代码,我看看。完成后告诉我。
  • 您将数据源嵌套在两个ForEachs 中。第一个可以访问部分,第二个可以访问行。使用它。
  • 很好@MojtabaHosseini 谢谢
猜你喜欢
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
相关资源
最近更新 更多