当用户点击EditButton
并显示为“完成”时,如何设置要执行的操作?甚至有可能这样做吗?
请注意,这与对用户可能执行的每个单独编辑(例如onDelete
或onMove
)执行操作不同。当用户完成所有更改并准备提交更改时,如何设置要执行的操作?
这是必要的,因为我正在对模型的临时副本进行所有更改,并且在用户单击“完成”之前,不会将更改提交到实际模型。我还提供了“取消”按钮来放弃更改。
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
似乎应该很容易。
答案 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应用程序这样做。 :-)