MST

星途 面试题库

面试题:Swift中SwiftUI的Form与List组件的数据绑定与交互处理

假设你正在开发一个待办事项应用,使用SwiftUI的Form和List组件。请阐述如何将用户在Form中输入的待办事项数据绑定到List中进行展示,并且实现点击List中的某一项可以标记该待办事项为已完成或未完成的交互逻辑。同时,说明在这个过程中如何处理数据的持久化存储(例如使用UserDefaults)。
29.2万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试
  1. 数据绑定与展示
    • 首先,定义一个数据模型来表示待办事项。例如:
struct TodoItem: Identifiable {
    let id = UUID()
    var title: String
    var isCompleted: Bool = false
}
  • 在视图模型中,创建一个@PublishedObservableObject来管理待办事项列表。
class TodoViewModel: ObservableObject {
    @Published var todoList: [TodoItem] = []
}
  • 在包含FormList的视图中,注入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)
                }
            }
        }
    }
}
  1. 点击标记完成或未完成
    • ListHStack中,使用Toggle组件来切换isCompleted状态。如上述代码中的Toggle("", isOn: $item.isCompleted),这里$item.isCompleted是双向绑定,点击Toggle就可以改变TodoItemisCompleted属性。
  2. 数据持久化存储(使用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()方法,确保数据及时保存。例如在ContentViewButton("Add")闭包中添加viewModel.saveData(),以及在Toggle改变状态时也会触发saveData(),因为todoList@Published,状态改变会通知ViewModel。这样就实现了使用UserDefaults进行数据的持久化存储。