Reputation: 21
I have EditNoteHost
view which displays NoteView
or EditNote
depending on editMode environment variable. Aslo Cancel
button is displayed in edit mode:
struct EditNoteHost: View {
@EnvironmentObject var modelData: ModelData
@Environment(\.editMode) var editMode
@State private var draftNote = Note.default
var body: some View {
VStack(alignment: .leading, spacing: 20) {
HStack {
if editMode?.wrappedValue == .active {
Button("Cancel") {
draftNote = modelData.selectedNote
editMode?.animation().wrappedValue = .inactive
}
}
Spacer()
EditButton()
}
if editMode?.wrappedValue == .inactive {
NoteView(note: modelData.selectedNote)
} else {
EditNote(note: $draftNote)
.onAppear {
draftNote = modelData.selectedNote
}
.onDisappear {
modelData.selectedNote = draftNote
}
}
}
.padding()
}
}
struct EditNoteHost_Previews: PreviewProvider {
static var previews: some View {
EditNoteHost()
.environmentObject(ModelData())
}
}
This code works fine.
Now I want to use EditNoteHost
in NavigationLink
and start it in edit mode:
NavigationLink(destination: EditNoteHost().environment(\.editMode, Binding.constant(EditMode.active)).environmentObject(modelData)) {
Image(systemName: "plus")
}
This part of code opens EditNoteHost
in edit mode if click +
. However, Done and Cancel buttons do nothing when tap.
How can I fix this?
Upvotes: 2
Views: 1377
Reputation: 5084
You are setting editMode
using .constant(EditMode.active)
, it will remain active. So do not set the environment for editMode
; instead use:
NavigationLink(destination: EditNoteHost()) {
Image(systemName: "plus")
}
and in EditNoteHost
, use:
.onAppear() {
editMode?.animation().wrappedValue = .active
}
Upvotes: 2