You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI List无法显示新增SwiftData Todo项问题排查

SwiftData添加待办事项后列表不更新的解决方法

核心问题与修复步骤

1. 根视图不匹配

你的mmApp入口加载的是ContentView(),但实际的待办事项视图是名为todo的结构体,导致待办视图从未被正确渲染。需要将App入口的根视图替换为待办视图(同时遵循Swift命名规范,将视图名改为首字母大写的TodoView)。

2. 列表未展示待办内容

List中硬编码了Text("Hello"),没有绑定待办事项的note属性,即使添加新项也看不到实际内容,需改为展示todo.note。

3. 预览缺少模型容器

预览时未注入SwiftData的modelContainer,导致预览无法访问数据上下文,需在预览中添加模型容器配置。

4. 手动确保上下文保存(可选但推荐)

虽然SwiftData会自动处理保存,但插入新数据后手动调用try? context.save(),可以确保数据立即持久化,避免因自动保存延迟导致的列表更新不及时。


修正后的完整代码

App入口文件

import SwiftUI
import SwiftData

@main
struct mmApp: App {
    var body: some Scene {
        WindowGroup {
            TodoView() // 替换为正确的待办视图
        }
        .modelContainer(for: Todo.self)
    }
}

待办事项视图(重命名为TodoView)

import SwiftUI
import SwiftData

struct TodoView: View {
    @Query private var todos: [Todo]
    @Environment(\.modelContext) private var context
    @State private var note = ""

    var body: some View {
        ZStack {
            VStack {
                NavigationStack {
                    List(todos, id: \.self) { todo in
                        HStack {
                            Text(todo.note) // 显示待办的实际内容
                                .swipeActions {
                                    Button("Delete", role: .destructive) {
                                        context.delete(todo)
                                        try? context.save() // 删除后保存上下文
                                    }
                                }
                        }
                    }
                    .safeAreaInset(edge: .bottom) {
                        VStack(alignment: .center, spacing: 20) {
                            Text("New ToDo")
                                .font(.headline)
                            HStack {
                                TextField("Todo", text: $note)
                                    .padding()
                                    .background(Color.white)
                                    .cornerRadius(8)
                                    .shadow(radius: 8)
                                    .frame(width: 300)
                                
                                Button(action: {
                                    // 过滤空内容
                                    guard !note.trimmingCharacters(in: .whitespaces).isEmpty else { return }
                                    let newNote = Todo(note: note)
                                    context.insert(newNote)
                                    try? context.save() // 手动保存确保数据持久化
                                    print(newNote.id, newNote.note)
                                    note = ""
                                }) {
                                    Label("Add", systemImage: "plus")
                                        .foregroundStyle(.white)
                                        .font(.subheadline)
                                        .bold(true)
                                }
                                .frame(width: 60, height: 44)
                                .background(Color.green)
                                .cornerRadius(10)
                                .disabled(note.trimmingCharacters(in: .whitespaces).isEmpty) // 空内容时禁用按钮
                            }
                        }
                        .padding()
                        .background(.bar)
                    }
                }
            }
        }
    }
}

#Preview {
    TodoView()
        .modelContainer(for: Todo.self) // 为预览添加模型容器
}

Todo模型文件(保持不变)

import Foundation
import SwiftData

@Model
class Todo {
    var id: UUID
    var note: String
    
    init(note: String) {
        self.id = UUID()
        self.note = note
    }
}

内容的提问来源于stack exchange,提问作者MMM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:52:26