SwiftUI .fullScreenCover 显示为 .sheet

Jer*_*ern 7 swiftui

我希望能够关闭一张纸并在之后立即呈现全屏覆盖,但是这似乎在两个状态修改之间没有延迟的情况下不起作用。

struct ContentView: View {
    
    @State var sheet = false
    @State var cover = false
    
    var body: some View {
        Button("Click me for sheet") {
            sheet = true
        }
        .fullScreenCover(isPresented: $cover) {
            Text("This is a full screen cover")
        }
        .sheet(isPresented: $sheet) {
            Text("This is a sheet")
            Button("This doesn't work") {
                sheet = false
                cover = true
            }
            Button("This works") {
                sheet = false
                DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                    cover = true
                }
            }
        }
        
    }
}

Run Code Online (Sandbox Code Playgroud)

单击“这不起作用”按钮会生成下图,演示全屏封面显示为一张纸且未覆盖整个屏幕:

在两次状态修改之间引入一个小延迟(通过单击“This Works”按钮来完成)可以解决此问题。

我对 SwiftUI 有什么不明白的地方可以解释这种行为?

在此输入图像描述

测试于:

  • Xcode 12.5.1
  • 运行 iOS 14.5 的 iPhone 12 Pro Max 模拟器

像这样将修饰符添加到单独的视图中也不起作用:

Text("Another view").sheet(isPresented: $sheet) { ...

wor*_*dog 1

你可以试试这个:

struct ContentView: View {
    
    @State var sheet = false
    @State var cover = false
    
    var body: some View {
        Button("Click me for sheet") {
            sheet = true
        }
        .fullScreenCover(isPresented: $cover) {
            Text("This is a full screen cover")
        }
        .sheet(isPresented: $sheet, onDismiss: {cover = true}) {
            Text("This is a sheet")
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)