SwiftUI EditButton操作完成

时间:2019-08-22 22:00:47

标签: swift swiftui

当用户点击EditButton并显示为“完成”时,如何设置要执行的操作?甚至有可能这样做吗?

请注意,这与对用户可能执行的每个单独编辑(例如onDeleteonMove)执行操作不同。当用户完成所有更改并准备提交更改时,如何设置要执行的操作?

这是必要的,因为我正在对模型的临时副本进行所有更改,并且在用户单击“完成”之前,不会将更改提交到实际模型。我还提供了“取消”按钮来放弃更改。

struct MyView: View {
    @Environment(\.editMode) var mode

    var body: some View {
        VStack {
            HStack {
                if self.mode?.value == .active {
                    Button(action: {
                        // discard changes here
                        self.mode?.value = .inactive
                    }) {
                        Text("Cancel")
                    }
                }

                Spacer()

                EditButton()
                // how to commit changes??
            }
            // controls to change the model
        }
    }
}

是否甚至可以在EditButton上为“完成”设置操作,还是我必须提供自己的按钮才能像EditButton一样工作?我当然可以这样做,但是使用EditButton似乎应该很容易。

4 个答案:

答案 0 :(得分:4)

使用 onChange modifier 的 XCode 12/iOS 14 的新答案。

此方法使用通过 editMode 提供的 SwiftUI @Environment 键路径以及新的 onChange 修饰符来确定视图何时进入和退出编辑模式。

在您看来,请执行以下操作:

@Environment(\.editMode) private var editMode

...

.onChange(of: editMode!.wrappedValue, perform: { value in 
  if value.isEditing {
     // Entering edit mode (e.g. 'Edit' tapped)
  } else {
     // Leaving edit mode (e.g. 'Done' tapped)
  }
})

答案 1 :(得分:2)

据我了解,EditButton旨在将整个环境置于编辑模式。这意味着要进入一种模式,例如,您需要重新排列或删除列表中的项目。或文本字段变为可编辑的位置。那样的事情。 “完成”表示“我已经完成编辑模式”,而不是“我想应用所做的更改”。您可能希望使用其他“应用更改”,“保存”,“确认”或其他按钮来执行这些操作。

答案 2 :(得分:1)

您可以在仅以编辑方式显示的视图上使用onDisappear()修饰符执行操作。 SwiftUI教程“ Working with UI Controls”中有一个有关如何执行此操作的示例:

if self.mode?.wrappedValue == .inactive {
    ProfileSummary(profile: profile)
} else {
    ProfileEditor(profile: $draftProfile)
        .onDisappear {
            self.draftProfile = self.profile
        }
}

在上面的示例代码中,由于您没有在编辑模式下显示视图,因此可以添加状态以检查是否单击了“取消”或“完成”,如下所示:

struct MyView: View {    
    @Environment(\.editMode) var mode
    @State var isCancelled = false

    var body: some View {
        VStack {
            HStack {
                if self.mode?.wrappedValue == .active {
                    Button(action: {
                            // discard changes here
                            self.mode?.wrappedValue = .inactive
                            self.isCancelled = true
                        }) {
                            Text("Cancel")
                        }
                        .onAppear() {
                            self.isCancelled = false
                        }
                        .onDisappear() {
                            if (self.isCancelled) {
                                print("Cancel")
                            } else {
                                print("Done")
                            }

                        }
                    }

                    Spacer()

                    EditButton()

                    // how to commit changes??
                }
                // controls to change the model
            }
        }
    }

答案 3 :(得分:0)

您的最后评论包含对事物的微妙更改。在此之前,听起来好像您都想要两者“完成”和“取消”按钮-很少有iOS应用程序可以这样做。

但是,如果您想要带有“仔细检查的事物”的“完成”按钮,您肯定可以通过manually进入编辑模式并检测何时进行编码来编码这样的事物不再存在。保存“之前”状态,在要更改弹出窗口时添加一个弹出窗口,您可以为用户提供回滚选项。

仅供参考-我是很多老学校。不只是PC,还有大型机。不只是微软,还有SAP。我当然希望在破坏性更改之前给用户最后的机会-但并不是有太多的iOS应用程序这样做。 :-)