如何从 SwiftUI 的另一个视图中删除列表中的项目? [英] How to delete an item of a list from another view in SwiftUI?
本文介绍了如何从 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屋!
查看全文