繁体   English   中英

SwiftUI 更改 State 不会关闭模态视图

[英]SwiftUI Changing State does not Dismiss Modal View

SwiftUI 更改 State 不会关闭模态视图

我有一个带有 SwiftUI 生命周期的基本主/详细应用程序。 在详细信息页面上,我有一个按钮来切换 @State 以呈现用于编辑详细信息项的模式。 我正在使用 fullScreenCover 模式。 Detail 视图中的@State 变量作为@Binding 传递给Edit 视图。

编辑视图有一个“完成”按钮可以自行关闭。 我尝试过使用 binding 和 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 变量是否存在问题。 这是一个示例控制台 output:

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

我想问题是您错过了在 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM