繁体   English   中英

onDelete() function 处理程序如何在 swiftUI 列表中工作?

[英]How does onDelete() function handler work in a swiftUI List?

所以我知道以下代码有效:

struct ContentView: View {
    func removeRows(at offsets: IndexSet) {
        numbers.remove(atOffsets: offsets)
    }
    
    @State private var numbers = [Int]()
    @State private var currentNumber = 1

    var body: some View {
        VStack {
            List {
                ForEach(numbers, id: \.self) {
                    Text("\($0)")
                }
                .onDelete(perform: removeRows)
            }

            Button("Add Number") {
                self.numbers.append(self.currentNumber)
                self.currentNumber += 1
            }
        }
    }
}

我不明白.onDelete()removeRows(at offsets: IndexSet)自定义 function 处理程序是如何工作的。 具体来说,为什么at偏移前有一个参数 label offsets: 例如,您可以使用on代替at吗? 参数标签只是为了让我们更好地理解代码吗?

然后是IndexSet ,我认为我理解为一种类型,它包含一个用于索引目的的 Int 或用于删除列表中的一行的 Int 范围,以便 swiftui 知道要删除哪一行?

我想我理解numbers.remove(atOffsets: offsets)用于实际删除offsets处的列表行(就被删除的实际行索引而言) - 但我不确定 swift 是如何实际知道offsets的? 实际上什么是offsets以及它的值是如何设置的?

我正在尝试通过遵循这个来学习。 我仍然对 swiftui 有非常基本的了解,所以请像我是超级菜鸟一样解释一下。

如果您查看onDelete签名:

@inlinable public func onDelete(perform action: ((IndexSet) -> Void)?) -> some DynamicViewContent

您可以看到它需要一个类型为((IndexSet) -> Void)? .

这意味着它需要一个 function 接受IndexSet参数并返回Void

您的removeRows function 具有与所需完全相同的类型:

func removeRows(at offsets: IndexSet) { ...

*以上签名等同于:

func removeRows(at offsets: IndexSet) -> Void { ...

为了清楚起见at使用了 label。 它也可以称为someCustomLabel

func removeRows(someCustomLabel offsets: IndexSet) { ...

但是你需要这样称呼它:

removeRows(someCustomLabel: indexSet)

您也可以完全跳过 label:

func removeRows(offsets: IndexSet) { ...

并像这样调用您的 function:

removeRows(offsets: indexSet)

注意:

.onDelete(perform: removeRows)

是相同的:

.onDelete(perform: { indexSet in
    self.removeRows(at: indexSet)
})

IndexSet指定要删除的索引。 当您在List中的一行上向左滑动时,它会调用onDelete function 传递IndexSet参数中的行索引。

请注意, numbers.remove(atOffsets: offsets)需要atOffsets label 的IndexSet参数(并且您不能更改此标签),但您可以根据需要随意命名参数:

func removeRows(at indexSetToDelete: IndexSet) {
    numbers.remove(atOffsets: indexSetToDelete)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM