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

Posted

技术标签:

【中文标题】在 SwiftUI 中按 ID 删除列表中的项目【英文标题】:Delete an Item in a list in SwiftUI by ID 【发布时间】:2021-09-06 11:08:14 【问题描述】:

我有一个包含可识别项目的列表,如何手动删除,参数是项目的 id??

查看:

struct FavListView: View 
    @StateObject var favList = FavViewModel()
    @ViewBuilder
    var body: some View 
        NavigationView 
            List 
                ForEach(favList.items, id: \.self.id)  data in
                    NavigationLink(
                        destination: ItemDisplayVC(data.slug ?? "").navigationTitle("").navigationBarHidden(true),
                        label: 
                            ListContentItem(name: data.name ?? "", image: data.image ?? "", released: data.released ?? "", rank: data.rank ?? -1)
                        )
                
                .onDelete(perform:  indexSet in
                    print("\(indexSet)")
                )
            
            .navigationTitle("Favourite")
            .onAppear 
                favList.fetchData()
        
        
    

这是模型

public struct ItemPreviewModel: Codable, Hashable, Identifiable 
    public var id: Int?
    var slug: String?
    var name: String?
    var image: String?
    var released: String?
    var desc: String?
    var rating: Float?
    var rank: Int?

    enum CodingKeys: String, CodingKey 
        case name, rating, released, id, slug
        case desc = "description_raw"
        case image = "background_image"
        case rank = "rating_top"
    


这是删除数据库中项目的手动函数:


func onDelete(id:Int)  
///perform delete by id
// refresh the view

我可以使用 swiftui 中的任何内置本机函数吗?因为我喜欢将删除动画整合到列表中。

非常感谢

【问题讨论】:

这是一个 SwiftUI 问题吗?如果是,SwiftUI 代码在哪里? 对不起,我忘记添加了 您的视图显示您的视图模型FavViewModel 中的项目。因此,您可以在视图模型中实现 delete(id:) 我已经做到了,我已经在我的视图模型中构建了 onDelete 函数 但是,我想使用 ForEarch 中 onDelete 的内置动画 【参考方案1】:

你可以试试这样的:

List 
       ForEach(favList.items, id: \.self.id)  data in
           NavigationLink(
               destination: ItemDisplayVC(data.slug ?? "").navigationTitle("").navigationBarHidden(true),
               label: 
                   ListContentItem(name: data.name ?? "", image: data.image ?? "", released: data.released ?? "", rank: data.rank ?? -1)
               )
       .onDelete(perform: deleteItemsId)
   

    func deleteItemsId(at offsets: IndexSet) 
        for i in offsets.makeIterator() 
            let theItem = favList.items[i]
            // do your stuff with theItem.id
            // onDelete(id: theItem.id)
        
    

【讨论】:

谢谢你,最后。你真的帮了我很多,喜欢很多

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

在 SwiftUI 中使用模态视图删除列表中的项目时崩溃

如何从 Mac OS 中的 SwiftUI 列表中删除底部/顶部项目填充

点击 SwiftUI 时从列表中删除

SwiftUI 点击手势阻止列表中的项目删除操作

在 SwiftUI 分组表中按下编辑模式按钮之前不会删除行

在 SwiftUI 中使用绑定值添加和删除列表部分