SwiftUI 更改状态不会关闭模态视图
我有一个带有 SwiftUI 生命周期的基本主/细节应用。在详情页,我 有一个按钮来切换 @State 以显示用于编辑详细信息项的模式。我是 使用 fullScreenCover 模式。 Detail 视图中的@State 变量作为 一个 @Binding 到 Edit 视图。
编辑视图有一个“完成”按钮来关闭它自己。我已经尝试使用两种绑定进行编码 和presentationMode方法。
这一切都有效,只是在极少数情况下点击“完成”按钮不会关闭 编辑视图。然后我必须关闭应用程序并重新启动。所做的编辑 仍然按预期保存。根本无法从那个屏幕上移开。
Detail 视图像这样调用 Edit 视图:
.fullScreenCover(isPresented: $showEditModalView) {//showEditView
InvItemEditView(showEditModalView: $showEditModalView,
invItem: self.invItem,
inputCategory1: self.inputCategory1).environment(\.managedObjectContext, managedObjectContext)
}//full screen
完成按钮的编码如下:
Button(action: {
self.saveEditedRecord()
print("Before change - Done button showEditModalView is \(self.showEditModalView)")
self.showEditModalView = false
print("I got passed showEditModalView = false")
self.presentationMode.wrappedValue.dismiss()
print("I got passed presentationMode dismiss")
print("After change - Done button showEditModalView is \(self.showEditModalView)")
}) {
Text("Done")
.font(.system(size: 20))
}//trailing button
.disabled(self.localDisableSaveButton)
.disabled(self.dataStore.pubDisableEditButton)
saveEditedRecord 就是这样做的 - 它发出 Core Data saveContext。
我无法按需复制错误。它只是偶尔发生。我很好奇 看到 Button 操作总是执行所有代码行 - 我原以为它会 一旦控制视图呈现的变量发生变化,就终止。我搜索了 其他可能对 fullScreenCover 有问题但没有发现任何相关问题的人。我添加了 打印语句以查看设置@State 变量是否存在问题。这是一个 示例控制台输出:
CoreData: debug: CoreData+CloudKit: -[NSCloudKitMirroringDelegate managedObjectContextSaved:](2092): <NSCloudKitMirroringDelegate: 0x2837a8680>: Observed context save: <NSPersistentStoreCoordinator: 0x2827ab4f0> - <NSManagedObjectContext: 0x2837a9790>
in invItemEditView saveEditedRecord, in do after context.save
Before change - Done button showEditModalView is true
I got passed showEditModalView = false
I got passed presentationMode dismiss
After change - Done button showEditModalView is false
失败时,Core Data项后的第一个控制台语句是:
Before change - Done button showEditModalView is false
任何指导将不胜感激。 Xcode 12.4 iOS 14.4
答案 0 :(得分:0)
我猜问题是你没有在 SwiftUI 模态视图中添加演示环境。
这是 SwiftUI 中的完整示例:
struct ContentView: View {
@State private var showEditModalView = false
@Environment(\.presentationMode) var presentationMode
var body: some View {
Button(action: {
self.showEditModalView = true
}) {
Text("Show modal")
}.fullScreenCover(isPresented: $showEditModalView) {
InvItemEditView()
}
}
}
struct InvItemEditView: View {
@Environment(\.presentationMode) private var presentationMode
var body: some View {
Group {
Text("Modal view")
Button(action: {
self.presentationMode.wrappedValue.dismiss()
}) {
Text("Done")
.font(.system(size: 20))
}
}
}
}
我还建议阅读这个问题:SwiftUI dismiss modal