alexk
alexk

Reputation: 21

SwiftUI EditButton() does not work when set editMode in NavigationLink

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?

Screenshot

Upvotes: 2

Views: 1377

Answers (1)

RelativeJoe
RelativeJoe

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

Related Questions