- 数据绑定与展示:
struct TodoItem: Identifiable {
let id = UUID()
var title: String
var isCompleted: Bool = false
}
- 在视图模型中,创建一个
@Published
的ObservableObject
来管理待办事项列表。
class TodoViewModel: ObservableObject {
@Published var todoList: [TodoItem] = []
}
- 在包含
Form
和List
的视图中,注入TodoViewModel
,并在Form
中使用TextField
获取用户输入,将输入添加到todoList
中。
struct ContentView: View {
@ObservedObject var viewModel = TodoViewModel()
@State private var newTodoTitle = ""
var body: some View {
VStack {
Form {
TextField("Add new todo", text: $newTodoTitle)
Button("Add") {
if!newTodoTitle.isEmpty {
viewModel.todoList.append(TodoItem(title: newTodoTitle))
newTodoTitle = ""
}
}
}
List(viewModel.todoList) { item in
HStack {
Toggle("", isOn: $item.isCompleted)
Text(item.title)
}
}
}
}
}
- 点击标记完成或未完成:
- 在
List
的HStack
中,使用Toggle
组件来切换isCompleted
状态。如上述代码中的Toggle("", isOn: $item.isCompleted)
,这里$item.isCompleted
是双向绑定,点击Toggle
就可以改变TodoItem
的isCompleted
属性。
- 数据持久化存储(使用UserDefaults):
- 在
TodoViewModel
中添加保存和加载数据的方法。
class TodoViewModel: ObservableObject {
@Published var todoList: [TodoItem] = []
private let userDefaultsKey = "TodoList"
init() {
loadData()
}
func saveData() {
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(todoList) {
UserDefaults.standard.set(encoded, forKey: userDefaultsKey)
}
}
func loadData() {
if let data = UserDefaults.standard.data(forKey: userDefaultsKey) {
let decoder = JSONDecoder()
if let decoded = try? decoder.decode([TodoItem].self, from: data) {
todoList = decoded
}
}
}
}
- 在添加新待办事项和切换完成状态后调用
saveData()
方法,确保数据及时保存。例如在ContentView
的Button("Add")
闭包中添加viewModel.saveData()
,以及在Toggle
改变状态时也会触发saveData()
,因为todoList
是@Published
,状态改变会通知ViewModel
。这样就实现了使用UserDefaults
进行数据的持久化存储。