【问题标题】:SwiftUI Changing State does not Dismiss Modal ViewSwiftUI 更改状态不会关闭模态视图
【发布时间】:2021-05-04 00:17:08
【问题描述】:

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

我有一个带有 SwiftUI 生命周期的基本主/细节应用程序。在详细信息页面上,我 有一个按钮来切换@State 以呈现用于编辑详细信息项的模式。我是 使用 fullScreenCover 模式。 Detail 视图中的@State 变量传递为 编辑视图的@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 变量是否存在问题。这是一个 控制台输出示例:

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

【问题讨论】:

    标签: ios swiftui


    【解决方案1】:

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

    【讨论】:

    • 感谢您的想法,乔纳斯。事实上,我确实将@Environment(\.presentationMode) 包含在所有三个视图中——列表、详细信息、编辑。我还尝试添加一个单独的关闭按钮来关闭编辑视图。当我失败时,该按钮不会产生任何动作,就像完成按钮一样。我开始认为这是新的 .fullScreenCover 的错误。
    • 你试过没有self.showEditModalView = false按钮动作吗?我的猜测是,您将演示文稿 bool 设置为 false 并且还试图关闭演示环境。这可能有点令人困惑。
    • 是的。我已经尝试了每一个,都以任何顺序。我要运行一些测试——也许核心数据保存会导致某种异步延迟。如果这不能导致任何地方,我几乎没有想法。
    • 是的,可能是这样。尝试将其设置到最后并异步运行。也许这可能是一个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2011-11-02
    • 1970-01-01
    相关资源
    最近更新 更多