【发布时间】:2019-10-29 10:41:00
【问题描述】:
我想通过使用 .onDelete 修饰符在 SwiftUI Section 上实现滑动删除功能。问题是它总是删除列表中的第一项。
我的视图有一个列表,其中包含使用ForEach 创建的动态部分。
struct SetListView : View {
var setlist: Setlist
var body : some View {
List {
ForEach(setlist.sets) {
SetSection(number: $0.id, songs: $0.songs)
}
}
.listStyle(.grouped)
}
}
在每个部分中,还有另一个ForEach 用于创建动态行:
private struct SetSection : View {
var number: Int
@State var songs: [Song]
var body : some View {
Section (header: Text("Set \(number)"), footer: Spacer()) {
ForEach(songs) { song in
SongRow(song: song)
}
.onDelete { index in
self.songs.remove(at: index.first!)
}
}
}
}
在调试时,我发现IndexSet 指的是当前部分而不是行。所以当从第一部分删除项目时,总是第一个项目被删除(因为第一部分的索引是 0)。
这是 SwiftUI 中的错误吗?
如果没有,那我如何获得该行的索引?
【问题讨论】:
-
这肯定是你的数据结构有问题。确保在删除特定歌曲时更新集
-
我不同意。问题不是在删除歌曲之后发生,而是在删除之前。我认为我的数据结构与传递给闭包的 IndexSet 没有任何关系。
-
我认为这是一个错误,或者至少是一个意外行为。如果您有多个 ForEach () {}.onDelete () 您将获得 ForEach 在所有 ForEach 定义中的位置
标签: swift list foreach swiftui