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

无编译错误但NavigationLink触发笔记App崩溃的技术求助

解决SwiftUI笔记App点击条目崩溃问题

你的App点击笔记崩溃主要有几个核心问题:

  • NavigationLink传参错误:你在NavigationLink里新建了Note(),这个对象没有关联到Core Data上下文,而QuickNoteEditor用@ObservedObject托管这个对象,后续操作会触发崩溃。
  • 变量名拼写错误:selectedNote计算属性里用了未定义的selectedNoteId,应该是你已经获取到的NoteId。
  • 视图命名不匹配:代码里写的NoteEditor实际是QuickNoteEditor,存在命名不一致。
  • 函数调用错误:工具栏按钮调用的createQuickNote、删除命令调用的deleteSelectedQuickNotes都不存在,应该对应createNote和deleteSelectedNotes。

修复步骤

  1. 修正NavigationLink传参:把目标视图的参数改成循环中的note对象,确保传递的是已被Core Data托管的实例
  2. 修正selectedNote变量名错误:替换未定义的变量引用
  3. 统一变量命名规范:遵循Swift小驼峰命名规则,修正NotesIds为noteIds
  4. 修复函数调用错误:替换不存在的函数名

修正后的ContentView

struct ContentView: View {
    
    @Environment(\.managedObjectContext) private var viewContext
    
    @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Note.name, ascending: true)])
    var notes: FetchedResults<Note>
    
    @State private var noteIds: Set<Note.ID> = [] // 修正命名
    
    private var selectedNote: Note?{
        guard let noteId = noteIds.first, // 修正变量名
              let selectedNote = notes.filter({$0.id == noteId}).first else{ // 修正变量引用
                  return nil
              }
        return selectedNote
    }
    
    var body: some View {
        NavigationView{
            List(notes, selection: $noteIds){ note in
                // 修正导航目标视图和传参
                NavigationLink(note.name, destination: QuickNoteEditor(note: note))
            }
            if let note = selectedNote{
                Text(note.text)
            } else{
                Text("No note selected")
                    .foregroundColor(.secondary)
            }
            
        }
        .listStyle(SidebarListStyle())
        .onDeleteCommand(perform: deleteSelectedNotes) // 修正函数名
        .toolbar{
            ToolbarItem(placement: .primaryAction){
                Button(action: createNote){ // 修正函数名
                    Label("Create new Note", systemImage: "square.and.pencil")
                }
            }
        }
    }
    
    private func createNote(){
         createNote(name: "New note", text: "")
    }
    
    private func createNote(name: String, text: String) {
        withAnimation {
            let note = Note(context: viewContext)
            note.id = UUID()
            note.name = name
            note.text = text
            
            do {
                try viewContext.save()
            } catch {
                let nsError = error as NSError
                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
            }
        }
    }
    
    private func deleteSelectedNotes(){
        let selectedNotes = notes.filter {noteIds.contains($0.id)}
        deleteNotes(notes: selectedNotes)
    }
    
    private func deleteNotes(notes: [Note]){
        viewContext.perform{ notes.forEach(viewContext.delete)}
    }
}

修正后的QuickNoteEditor(命名已匹配,无需其他修改)

struct QuickNoteEditor: View {
    
    @Environment(\.managedObjectContext) var viewContext
    @ObservedObject var note: Note
    
    var body: some View {
        TextEditor(text:$note.text)
            .onReceive(note.publisher(for: \.text), perform: setName)
            .onReceive(
                note.publisher(for: \.text)
                    .debounce(for: 0.5, scheduler: RunLoop.main)
                    .removeDuplicates()
            ){ _ in
                try? PersistenceController.shared.saveContext()
            }
            .navigationTitle(note.name)
    }
    
    func setName(from text: String){
        let text = text.trimmingCharacters(in: .whitespacesAndNewlines)
        if text.count > 0{
            note.name = String(text.prefix(20))
        } else {
            note.name = "New Note";
        }
    }
}

补充说明

  • Core Data的NSManagedObject实例必须通过上下文创建(比如Note(context: viewContext)),直接用Note()创建的对象没有被上下文托管,无法正常响应@ObservedObject的变更监听,也无法保存到数据库,这是导致崩溃的核心原因。
  • 遵循Swift命名规范:变量名、函数名采用小驼峰式,可大幅提升代码可读性和维护性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:01:23