【问题标题】:Delete an Item in a list in SwiftUI by ID在 SwiftUI 中按 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 的内置动画

标签: swift swiftui


【解决方案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)
        }
    }

【讨论】:

  • 谢谢你,最后。你真的帮了我很多,喜欢很多
猜你喜欢
  • 2021-08-29
  • 2020-08-31
  • 2021-08-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多