【问题标题】:How to delete an item of a list from another view in SwiftUI?如何从 SwiftUI 中的另一个视图中删除列表项?
【发布时间】:2020-11-04 08:39:28
【问题描述】:

我制作了一个练习应用,其中主视图是一个简单的列表。当点击列表的项目时,它会显示详细视图。详细视图内部是一个“删除”按钮,用于删除项目。

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

主视图:

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
}

和 ViewModel:

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

【问题讨论】:

    标签: swift list mvvm swiftui


    【解决方案1】:

    你需要在DetailView中传递item,比如by-index

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

    所以,可以通过索引删除

    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)
            }
        }
    }
    

    【讨论】:

    • 感谢您的回复!最后一个问题。当我按照您在 detaiView 中所说的替换代码时,出现此错误:“参数标签 '(_:)' 不匹配任何可用的重载”。我该如何解决?
    猜你喜欢
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多