![](/img/trans.png)
[英]How to programatically perform .onDelete animation on List in 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.