如何从 SwiftUI 的另一个视图中删除列表中的项目? [英] How to delete an item of a list from another view in SwiftUI?

查看:54
本文介绍了如何从 SwiftUI 的另一个视图中删除列表中的项目?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我制作了一个练习应用程序,其中主视图是一个简单的列表.当列表的项目被点击时,它会显示详细信息视图.详细视图内有一个删除"按钮,用于删除项目.

I made a practice app where the main view is a simple list. When the item of the list is tapped, it presents the detail view. Inside the detail view is a "delete" button that deletes the item.

如何从详细视图中删除每个项目?

How can I delete each item form the detail view ?

主视图:

struct ContentView: View {
    @EnvironmentObject var viewModel: ViewModel
    
    var body: some View {
        NavigationView {
            List {
                ForEach(0 ..< viewModel.items.count, id: \.self) { index in
                    NavigationLink(destination: DetailView()) {
                        Text(self.viewModel.items[index].title)
                    }
                }
            }
            .navigationBarTitle("Practice")
            .navigationBarItems(trailing: Button(action: makeNew) {
                Text("Add")
            })
        }
    }
    
    func makeNew() {
        withAnimation {
            viewModel.items.append(Model(title: "New Item \(viewModel.items.count + 1)"))
        }
    }
}

详细视图:

struct DetailView: View {
    @EnvironmentObject var viewModel: ViewModel
    
    var body: some View {
        Button(action: remove) {
            Text("Delete")
        }
    }
    
    func remove(at offsets: IndexSet) {
        withAnimation {
            viewModel.items.remove(atOffsets: offsets)
        }
    }
}

模型:

struct Model: Identifiable {
    var id = UUID()
    var title: String
}

和视图模型:

class ViewModel: ObservableObject {
    @Published var items = [Model]()
}

推荐答案

你需要在DetailView中传递item,就像by-index

You need to pass item in DetailView, like by-index

NavigationLink(destination: DetailView(index: index)) {   // << here !!
    Text(self.viewModel.items[index].title)
}

所以,可以通过索引删除

so, it is possible to remove by index

struct DetailView: View {
    @EnvironmentObject var viewModel: ViewModel
    let index: Int
    
    var body: some View {
        Button("Delete") {
            self.remove(at: IndexSet(integer: self.index))   // << here !!
        }
    }
    
    func remove(at offsets: IndexSet) {
        withAnimation {
            viewModel.items.remove(atOffsets: offsets)
        }
    }
}

这篇关于如何从 SwiftUI 的另一个视图中删除列表中的项目?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆