在 SwiftUI 中的列表上实现删除功能

Posted

技术标签:

【中文标题】在 SwiftUI 中的列表上实现删除功能【英文标题】:Implementing a delete feature on a list in SwiftUI 【发布时间】:2020-07-23 02:55:42 【问题描述】:

我按照this document(和this one)使用SwiftUI删除 功能添加到我的应用程序列表中。两个页面都说,一旦您添加了 .onDelete(perform: ...) 段代码,您将能够滑动并获得一个 Delete 按钮。然而,这不是我所看到的。代码可以编译,但我在滑动时什么也看不到。

我的列表由如下代码备份:

@FetchRequest(
    entity: ...,
    sortDescriptors: []
) var myList: FetchedResults<MyEntity>

而不是 @State。这可能是个问题吗?

下面是更多相关代码,以防万一这可能有用:

private func deleteSpot(at index: IndexSet) 
    print(#function)


.........

var body: some View 
    VStack 
        ForEach(self.myList, id: \.self.name)  item in
            HStack 
                Spacer()
                Button(action: 
                    self.showingDestinList.toggle()
                    .....
                    UserDefaults.standard.set(item.name!, forKey: "LocSpot")
                ) 
                    item.name.map(Text.init)
                        .font(.largeTitle)
                        .foregroundColor(.secondary)
                
                Spacer()
            
        .onDelete(perform: deleteSpot)
    

【问题讨论】:

最小的可重现示例? @Asperi,我只是在帖子中添加了一些相关代码,希望这可能会有些用处。 【参考方案1】:

动态容器的滑动删除仅适用于List,所以制作

var body: some View 
    List               // << here !!
        ForEach(self.myList, id: \.self.name)  item in
            HStack 

              // ... other code

            
        .onDelete(perform: deleteSpot)
    

【讨论】:

是的。确实你是对的。在失去了相当多的时间之后,我才找到了相同的答案。谢谢。【参考方案2】:

通过搜索和尝试各种选项,我最终找到了问题所在。 我觉得这个解决方案有点荒谬,但为了避免其他人浪费时间,这里是:

帖子中的最后一部分代码需要修改如下才能正常工作。

var body: some View 
    VStack 
      List 
        ForEach(self.myList, id: \.self.name)  item in
            HStack 
                Spacer()
                Button(action: 
                    self.showingDestinList.toggle()
                    .....
                    UserDefaults.standard.set(item.name!, forKey: "LocSpot")
                ) 
                    item.name.map(Text.init)
                        .font(.largeTitle)
                        .foregroundColor(.secondary)
                
                Spacer()
            
        .onDelete(perform: deleteSpot)
      
    

【讨论】:

以上是关于在 SwiftUI 中的列表上实现删除功能的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 搜索栏功能通过结构数组进行搜索

如何在不中断删除的情况下在 SwiftUI 中实现 TextField 列表

SwiftUI:删除列表中的动画?

从 SwiftUI 中的列表中删除绑定

SwiftUI:无法删除列表中的行

在 SwiftUI 中按 ID 删除列表中的项目