问题描述
我有一个带有两个视图的笔记应用:TempNoteView 和 NoteView。
在 NoteView 中按下保存按钮后,它会使用当前日期更新 createdAt
。但是,当我返回到我的 TempNoteView 时,使用 saveContext()
保存变量后,导航视图会跳回到上一个视图 (NoteView)。如果我删除 NSSortDescriptor,问题就会消失。我该如何解决这个问题?
TempNoteView
struct TempNoteView: View {
@Environment(\.managedobjectContext) private var viewContext
@FetchRequest(
entity: Note.entity(),sortDescriptors: [
NSSortDescriptor(keyPath: \Note.createdAt,ascending: false)
]
) private var notes: FetchedResults<Note>
var isNoteView = false
var body: some View {
List {
ForEach(notes,id: \.self) { note in
NavigationLink(destination: NoteView(isNoteView: true,note: note)) {
Text(note.name ?? "Untitled")
Spacer()
}
}.onDelete(perform: deleteNotes)
}
.navigationTitle("Notes")
.navigationBarItems(trailing: Button(action: {addNote()},label: {
Text("Add Note")
}))
}
}
NoteView
struct NoteView: View {
// DATABASE ON CORE DATA
@Environment(\.managedobjectContext) private var viewContext
@State var noteName: String = ""
@State var fullText: String = ""
@State var notePin: Bool = false
@State var isNoteView = false
@State var editMode = false
@State var note : Note
var body: some View {
if isNoteView == true {
ZStack {
NavigationView {
vstack {
if editMode {
ToolBar()
}
}.padding(.top,60)
}
.navigationBarTitle("")
.navigationBarHidden(true)
.onAppear(){
self.fullText = note.content!
self.noteName = note.name!
self.notePin = note.pin
}
vstack {
HStack {
Spacer()
Button(action: {
// for saving content
if editMode == false {
self.editMode = true
} else {
note.content = fullText
note.name = noteName
note.createdAt = Date()
saveContext()
self.editMode = false
}
}) {
if editMode == false {
Image("pen").resizable().frame(width:23,height: 23)
} else {
Image("save").resizable().frame(width:23,height: 23)
}
}
}
Spacer()
}
}
}
}
func saveContext() {
do {
try viewContext.save()
} catch {
let error = error as NSError
fatalError("Unresolved Error: \(error)")
}
}
}
解决方法
尝试保存导航状态并将其传递给每个 NavigationLink
:
@State var selectedNote: Note? = nil
var body: some View {
List {
ForEach(notes,id: \.self) { note in
NavigationLink(destination: NoteView(isNoteView: true,note: note),tag: note,selection: $selectedNote,label: {
Text(note.name ?? "Untitled")
Spacer()
})
}.onDelete(perform: deleteNotes)
}
...