SwiftUI 是苹果推出的一个用于构建用户界面的框架,它允许开发者使用声明式语法来描述用户界面。在 SwiftUI 中,List
是一个常用的组件,用于展示一组数据。
假设我们有一个待办事项列表,每个待办事项都有一个唯一的标识符和一个描述。我们将展示如何从列表中删除一个待办事项。
import SwiftUI
struct TodoItem: Identifiable {
let id = UUID()
var title: String
}
class TodoViewModel: ObservableObject {
@Published var todos = [
TodoItem(title: "Buy groceries"),
TodoItem(title: "Finish report"),
TodoItem(title: "Call mom")
]
func deleteTodo(at offsets: IndexSet) {
todos.remove(atOffsets: offsets)
}
}
struct ContentView: View {
@StateObject private var viewModel = TodoViewModel()
var body: some View {
NavigationView {
List {
ForEach(viewModel.todos) { todo in
Text(todo.title)
}
.onDelete(perform: viewModel.deleteTodo)
}
.navigationTitle("Todos")
.toolbar {
EditButton()
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
id
和一个 title
。@Published
属性包装器来通知视图数据的变化。deleteTodo
方法用于删除指定索引的待办事项。List
组件展示待办事项列表,并通过 onDelete
手势来触发删除操作。原因:可能是由于 @Published
属性包装器没有正确触发视图更新,或者 onDelete
手势没有正确绑定到 deleteTodo
方法。
解决方法:
TodoViewModel
是使用 @StateObject
创建的。onDelete
手势正确绑定到 deleteTodo
方法。struct ContentView: View {
@StateObject private var viewModel = TodoViewModel()
var body: some View {
NavigationView {
List {
ForEach(viewModel.todos) { todo in
Text(todo.title)
}
.onDelete(perform: viewModel.deleteTodo) // 确保这里正确绑定
}
.navigationTitle("Todos")
.toolbar {
EditButton()
}
}
}
}
通过以上步骤,可以确保从列表中删除行的功能正常工作。