macos - SwiftUI 工作表崩溃,偶尔会出现关于修改状态的警告
问题描述
我有一个 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 状态的情况下隐藏模式并进行保存(从屏幕上删除视图)?
解决方案
我建议使用和sheet(isPresented:onDismiss:content:)
调用:model.saveThing
onDismiss
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
变量检测它是如何关闭的 - 请参阅:
推荐阅读
- tesseract - Tesseract 新字体训练失败
- python - 带有图形安装程序的 anaconda 文件夹的路径
- vuejs2 - 将插槽传递给插槽
- angular - Angular 4:对 XMLHttpRequest 的访问已被 CORS 策略阻止
- javascript - AJAX PHP 图片上传不起作用,$_FILES 为空?
- python - 硒 - 没有找到这样的元素
- swift - WWDC 2019“Combine in Practice”代码示例中的错误 CombineLatest?
- android - kotlin 中的字符串格式和可变参数
- r - 降价中的R mtext / lines“尚未调用plot.new”
- php - 如何将新值添加到现有数组的开头?