SwiftUI 工作表在第一次出现时就被忽略了

sas*_*ash 7 swift swiftui

这个错误快把我逼疯了。有时(大多数情况下)呈现的工作表在第一次打开时会被忽略。这种情况仅发生在设备上并且仅在应用程序第一次启动时发生。这是使用 Xcode 12.1 构建的运行 iOS 14.1 的 iPhone 11 上的外观(也可以在运行 iOS 14.0.1 的 iPhone 7 Plus 上重现):

在此输入图像描述

视频中的步骤:

  1. 我打开应用程序
  2. 快速导航到详细信息视图
  3. 打开表
  4. 红衣被系统解雇???
  5. 我再次打开工作表,它仍按预期保留在屏幕上。

这是SwitUI App项目(使用UIKIt App Delegate)和部署iOS 14。代码:

struct ContentView: View {
   
    var body: some View { 
        NavigationView {
            NavigationLink(destination: DetailsView()) {
                Text("Open Details View")
            }
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

struct DetailsView: View {
   
    @State var sheetIsPresented: Bool = false
 
    var body: some View {
        VStack {
            Button("Open") {
                sheetIsPresented.toggle()
            }
        }.sheet(isPresented: $sheetIsPresented, content: {
            SheetView()
        })
    }
}

struct SheetView: View {
   
    var body: some View {
        Color.red
    }
}
Run Code Online (Sandbox Code Playgroud)

我能够通过删除 line 来解决这个问题.navigationViewStyle(StackNavigationViewStyle()),但StackNavigationViewStyle我的项目中需要。任何帮助将不胜感激。

更新:Apple 论坛上有一个类似的帖子,其中工作表视图的行为随机奇怪。我发现的一种解决方案是将工作表移至外部的根视图NavigationLink(在ContentView我的示例中),但这不是理想的解决方案。

Yrb*_*Yrb 4

我在应用程序中遇到了同样的问题。经过大量研究,我发现将变量设为观察对象可以解决 SwiftUI 1 中的问题,并且似乎在 SwiftUI 2 中也是如此。我确实记得这是实际设备上的间歇性问题,但它总是发生在模拟器中。我希望我能记住为什么,也许当工作表出现时它会重置绑定变量?但是这段代码解决了问题:

import SwiftUI
import Combine

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: DetailsView()) {
                Text("Open Details View")
            }
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

struct DetailsView: View {
   
    @ObservedObject var sheetIsPresented = SheetIsPresented.shared
    
    var body: some View {
        VStack {
            Button("Open") {
                sheetIsPresented.value.toggle()
            }
        }.sheet(isPresented: $sheetIsPresented.value, content: {
            SheetView()
        })
    }
}

struct SheetView: View {
   
    var body: some View {
        Color.red
    }
}

final class SheetIsPresented: NSObject, ObservableObject {
    let objectWillChange = PassthroughSubject<Void, Never>()
    
    static let shared = SheetIsPresented()
    
    @Published var value: Bool = false {
        willSet {
            objectWillChange.send()
        }
    }
    
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Run Code Online (Sandbox Code Playgroud)

在模拟器中的 Xcode 12.1、iOS 14.1 上进行了测试。