2

我已经开发 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 个视图 可供导航时(我不明白为什么这是一个重要的阈值,我的最终目标使用 aLazyVGrid和 a ForEach)和导航链接,第二个错误发生在旋转到横向然后返回到肖像。我认为这与手机如何呈现侧边栏有关,但甚至改变为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确实消除了第二个错误(但如果我确实想使用侧边栏样式则无济于事),但第一个错误仍然存​​在。在肖特基看来,更改VStackList也将消除第一个错误。但是,我认为解决集合视图的较新约定(至少基于 WWDC 视频)是在其中使用 a LazyV/HGridwith a ForEach,这实际上是我想要完成的。我没有把它作为我的代码放在这里,因为我当然希望能够以最简单的形式重现错误,以确保它不是隐藏在我的视图层次结构中的东西。

4

1 回答 1

0

我能够做到这一点的方法是通过我在 HackingWithSwift 上找到的一篇文章。我仍然不得不用它.navigationViewStyle(StackNavigationViewStyle())来消除一个不同的错误,因为 SwiftUI 的初始迭代似乎集中在 80% 的情况下,即多个 NavigationLink 仅真正存在于ListView 类型中。我没有用最新的 beta 测试过,但是如果你尝试使用其他导航样式(列),它会抛出另一个错误:unbalanced calls to begin/end appearance transactions. 我现在对此没问题,因为这至少允许我创建一个没有行分隔符和导航箭头的屏幕....我只是没有默认的主从设置。

于 2021-07-01T01:51:51.840 回答