我有一个SwiftUI按钮,当点击时,sheet
显示确认模式。当在模态中点击按钮进行确认时,我将其保存到Core Data。
我得到了一个或所有令人讨厌的结果:
- 表单只是挂起并且变得无响应。
- 我得到一个警告:"在视图更新期间修改状态,这将导致未定义的行为">。
- 我崩溃了。
显然,我正在修改状态变成我正在删除一个东西,但我不清楚如何正确地做这件事。
这是我点击删除的视图:
struct MyView: View{
@State var showDeleteModal = false
var body: some View{
Button("Delete"){
showDeleteModal.toggle()
}
.sheet(isPresented: self.$showDeleteModal) {
ModalView(confirm: {
self.showDeleteModal.toggle()
//Save the object in my Core Data stuff
model.saveThing(thing: thing)
})
}
}
}
这是我的模态,它有一个回调函数来确认删除:
struct ModalView: View {
var confirm:() -> Void
var body: some View {
Button("Confirm"){
confirm()
}
}
}
我如何隐藏模态并使保存(从屏幕上删除视图)而不干扰SwiftUI的状态?
我建议在onDismiss
中使用sheet(isPresented:onDismiss:content:)
并调用model.saveThing
:
struct MyView: View {
@State var showDeleteModal = false
var body: some View {
Button("Delete") {
showDeleteModal.toggle()
}
.sheet(isPresented: self.$showDeleteModal, onDismiss: onDismiss) {
ModalView()
}
}
func onDismiss() {
model.saveThing(thing: thing)
}
}
那么你可以在不知道父状态的情况下解散表单-只需使用@Environment(.presentationMode)
:
struct ModalView: View {
@Environment(.presentationMode) private var presentationMode
var body: some View {
Button("Confirm") {
presentationMode.wrappedValue.dismiss()
}
}
}
注意:由于工作表可以在不与确认按钮交互的情况下关闭,您可以使用另一个@State
变量来检测它是如何关闭的-参见:
- SwiftUI:如何在工作表关闭后显示警报?