SwiftUI的sheet在第一次显示时就被关闭了

7
这个bug让我疯了。有时(其实大部分时间)展示的页面第一次打开时就会被关闭。这只发生在设备上,而且只发生在首次启动应用程序时。以下是在iPhone 11上运行iOS 14.1并使用Xcode 12.1构建的情况(也可以在运行iOS 14.0.1的iPhone 7 Plus上重现):

enter image description here

视频中的步骤:

  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
    }
}

我能够通过删除行.navigationViewStyle(StackNavigationViewStyle())来解决这个问题,但是我需要在我的项目中使用StackNavigationViewStyle。任何帮助将不胜感激。
更新:苹果论坛上有一个类似的post,表现出随机奇怪的片段视图。 我发现的一个解决方案是将片段移动到根视图之外的NavigationLink(在我的例子中是ContentView),但这并不是理想的解决方案。

我在实体设备上尝试了,没有问题!在SE2上进行测试。 - ios coder
@Omid 谢谢。你能否尝试多次并快速执行所有操作(导航)?每次尝试后,请强制关闭应用程序。 - sash
我已经尽力了,将其发送到后台,然后返回前台,向上滑动,向下滑动,同时打开也没有问题!你在干净的设备上尝试过吗?这在过去有时会发生,旧项目崩溃对设备产生了一些影响。 - ios coder
在使用 Xcode 版本 12.1 (12A7403) 的物理设备或模拟器上没有任何问题。 - lorem ipsum
在 iPhone 7 Plus(iOS 14.0.1)上进行了测试,出现了相同的问题。 - sash
我也遇到了这个问题,你有解决方案吗?Xcode 13.3 - IDTIMW
2个回答

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()
    }
}

测试于模拟器中的Xcode 12.1和iOS 14.1。


0

将您的NavigationView视图添加到以下代码行中

.navigationViewStyle(StackNavigationViewStyle())

示例:


NavigationView {

}
.navigationViewStyle(StackNavigationViewStyle())

问题将会得到解决(我曾经面临过同样的问题)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接