【问题标题】:SwiftUI EditButton() does not work when set editMode in NavigationLink在 NavigationLink 中设置 editMode 时,SwiftUI EditButton() 不起作用
【发布时间】:2021-05-02 07:36:47
【问题描述】:

我有 EditNoteHost 视图,它根据 editMode 环境变量显示 NoteViewEditNote。还有Cancel按钮在编辑模式下显示:


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())
    }
}

这段代码运行良好。

现在我想在NavigationLink 中使用EditNoteHost 并在编辑模式下启动它:

NavigationLink(destination: EditNoteHost().environment(\.editMode, Binding.constant(EditMode.active)).environmentObject(modelData)) {
                    Image(systemName: "plus")
                }

如果单击+,这部分代码将以编辑模式打开EditNoteHost。但是,完成和取消按钮在点击时什么都不做。

我该如何解决这个问题?

Screenshot

【问题讨论】:

  • 请提供独立的最小可重现示例。

标签: ios swift xcode swiftui swiftui-navigationlink


【解决方案1】:

您正在使用 .constant(EditMode.active) 设置 editMode,它将保持活动状态。所以不要为editMode设置环境;改为使用:

NavigationLink(destination: EditNoteHost()) {
    Image(systemName: "plus")
}

在 EditNoteHost 中,使用

.onAppear() {
    editMode?.animation().wrappedValue = .active
}

【讨论】:

  • EditNoteHost().environment(\.editMode, Binding.constant(EditMode.active) 表示editMode环境变量将具有活动状态。这正是我需要的。EditButton()应该改变状态环境变量,但没有任何反应
  • yes .constants 意味着它总是 .active 尽量避免使用 .constant。我编辑了我的答案,如果它解决了你的问题,请告诉我!
  • @S_dnomseD 谢谢你的回答。不幸的是,这并不能解决我的问题。当我创建笔记时,这将正常工作。在这种情况下,我需要编辑模式。但是,当我选择现有笔记时,我需要在非活动模式下使用 EditNoteHost(
  • 在这种情况下,您可以将布尔值传递给 EditNoteHost,并在 onAppear 中使用: if editing { editMode?.animation().wrappedValue = .active }else { editMode?.animation().wrappedValue = .非活动}。因此,当您需要它时,主动传递 EditNoteHost(editing: true),非活动 EditNoteHost(editing: false)。
  • S_dnomseD 这看起来像是一个解决方案。谢谢!
猜你喜欢
  • 2021-09-07
  • 2019-11-14
  • 2021-12-15
  • 2019-11-15
  • 2019-12-28
  • 1970-01-01
  • 2019-12-12
  • 2021-12-23
  • 1970-01-01
相关资源
最近更新 更多