SwiftUI状态持久化存储

Nora253 +0/-0 0 0 正常 2025-12-24T07:01:19 状态管理 · SwiftUI · 持久化存储

在SwiftUI应用开发中,状态持久化是提升用户体验的关键环节。本文将分享一个完整的待办事项应用示例,展示如何实现状态的持久化存储。

核心思路

我们采用UserDefaults作为本地存储方案,结合@StateObject和@ObservedObject来管理应用状态。通过创建一个TodoStore类来封装数据读写逻辑。

代码实现

首先定义待办事项模型:

struct TodoItem: Codable {
    let id = UUID()
    var title: String
    var isCompleted: Bool
    var createdAt: Date
}

创建状态管理类:

@MainActor
class TodoStore: ObservableObject {
    @Published var todos: [TodoItem] = []
    private let userDefaultsKey = "SavedTodos"
    
    init() {
        loadTodos()
    }
    
    func addTodo(_ title: String) {
        let newTodo = TodoItem(title: title, isCompleted: false, createdAt: Date())
        todos.append(newTodo)
        saveTodos()
    }
    
    func toggleTodo(_ todo: TodoItem) {
        if let index = todos.firstIndex(where: { $0.id == todo.id }) {
            todos[index].isCompleted.toggle()
            saveTodos()
        }
    }
    
    private func saveTodos() {
        if let encoded = try? JSONEncoder().encode(todos) {
            UserDefaults.standard.set(encoded, forKey: userDefaultsKey)
        }
    }
    
    private func loadTodos() {
        if let data = UserDefaults.standard.data(forKey: userDefaultsKey),
           let decoded = try? JSONDecoder().decode([TodoItem].self, from: data) {
            todos = decoded
        }
    }
}

在主视图中使用:

struct ContentView: View {
    @StateObject private var todoStore = TodoStore()
    
    var body: some View {
        NavigationView {
            List {
                ForEach(todoStore.todos) { todo in
                    HStack {
                        Text(todo.title)
                            .strikethrough(todo.isCompleted)
                        Spacer()
                        Button("完成") {
                            todoStore.toggleTodo(todo)
                        }
                    }
                }
            }
            .navigationTitle("待办事项")
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    NavigationLink(destination: AddTodoView(store: todoStore)) {
                        Image(systemName: "plus")
                    }
                }
            }
        }
    }
}

复现步骤

  1. 创建新的SwiftUI项目
  2. 添加上述代码到项目中
  3. 运行应用,添加几条待办事项
  4. 关闭应用后重新打开,验证数据是否持久化

这种实现方式简单可靠,适合中小型应用的状态管理需求。

推广
广告位招租

讨论

0/2000