SwiftUI Xcode 12.5 具有非常基本的 NavigationView 布局问题

SwiftUI Xcode 12.5 with very basic NavigationView layout Issues

我已经开发 iOS 大约十年了,每次我尝试深入研究 SwiftUI 时,我都会花费比以往更多的时间来处理看似简单的任务。在使用非常简单的导航设置开发应用程序时,我一直在控制台中看到两个错误:Unable to present. Please file a bug.Unbalanced calls to begin/end appearance transitions for <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVVS_22_VariadicView_Children7ElementGVS_18StyleContextWriterVS_19SidebarStyleContext___: 0x7fd913d0bd90>。第一次发生时至少有 3 个视图 可以导航(我不明白为什么这是一个重要的阈值,我的最终目标使用 LazyVGridForEach) 带有导航链接,第二个错误发生在旋转到横向然后再返回纵向时。我认为这与 phone 显示侧边栏的方式有关,但即使更改为 StackNavigationViewStyle 也会产生类似的问题。

如果这是一个 UIKit 应用程序,我绝对可以解决调用不平衡的情况,但 SwiftUI 确实剥夺了我在构建视图和导航堆栈时习惯控制的一些较低级别的功能。

我最终尝试从头开始一个新项目并在 ContentView 中放置最少量的代码:

struct ContentView: View {
    
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: Text("Number 1")) {
                    Text("Number 1")
                }
                NavigationLink(destination: Text("Number 2")) {
                    Text("Number 2")
                }
                NavigationLink(destination: Text("Number 3")) {
                    Text("Number 3")
                }
            }
        }
    }
}

运行 上面的代码产生了旋转问题。我遇到的另一个问题是当您在这些问题开始后按下 < back 按钮时,导航完全停止工作并且“详细信息”视图永远不会更新。

很明显方向是 SwiftUI,所以我正在尝试真正朝这个方向发展(也许下周会有一些惊人的改进)但这似乎是一组非常简单的代码的一个非常重要的问题。我希望我只是做错了什么,有人可以迅速指出。

已编辑:

经过进一步探索,我发现第二个错误发生在 11、11 Pro Max 和 12 Pro Max 上,导航堆栈默认更改为侧边栏。将样式更改为 StackNavigationViewStyle 确实消除了第二个错误(但如果我确实想使用侧边栏样式则无济于事)但第一个错误仍然存​​在。对于肖特基的观点,将 VStack 更改为 List 也将消除第一个错误。然而,我认为解决集合视图的较新约定(至少基于 WWDC 视频)是使用 LazyV/HGrid 和其中的 ForEach 这实际上是我试图完成的。我没有把它作为我的代码放在这里,因为我当然希望能够以最简单的形式重现错误,以确保它不会隐藏在我的视图层次结构中。

我能够通过 post 我在 HackingWithSwift here 上找到的方法来实现这一点。我仍然不得不使用 .navigationViewStyle(StackNavigationViewStyle()) 来消除不同的错误,因为 SwiftUI 的初始迭代似乎集中在 80% 的情况下,其中多个 NavigationLinks 只真正存在于 List 视图类型中。我没有用最新的测试版对此进行测试,但如果您尝试使用其他导航样式(列),它将引发另一个错误:unbalanced calls to begin/end appearance transactions。我现在对此没有意见,因为这至少允许我创建一个没有行分隔符和导航箭头的屏幕....我只是默认没有主从设置。