导航视图旋转的 SwiftUI 错误?

SwiftUI bug with navigation view rotation?

在测试我的应用程序以确保其在屏幕旋转下正常运行时,我发现导航 links 在特定的旋转顺序后不起作用。

以下是MWE:

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink("link") {
                Text("hi")
            }
        }
    }
    // rotate ->  back -> link -> rotate -> back -> link
}

在 iPhone 13 Pro Max (iOS 15.2 (19C51)) 模拟器上,以下会导致错误:

  1. 运行应用程序处于纵向模式
  2. 将应用旋转到横屏模式
  3. 触摸 back 按钮(在导航栏中)
  4. 点击导航linklink
  5. 将应用旋转到纵向模式
  6. 触摸 back 按钮
  7. 现在触摸导航linklink不起作用!

此外,调试控制台打印:

Unbalanced calls to begin/end appearance transitions for <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentGS1_VVS_22_VariadicView_Children7ElementVS_24NavigationColumnModifier_GVS_18StyleContextWriterVS_19SidebarStyleContext___: 0x152f24860>.

这是 SwiftUI 中的错误吗? 有没有办法解决这个问题?

我在 macOS Monterey (12.2 (21D49)) + Xcode 13.2.1 (13C100).

将 ColumnNavigationViewStyle 更改为 StackNavigationViewStyle 将解决您的问题,您提到的序列很可能是一个错误,希望苹果能尽快解决。

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink("link") {
                Text("hi")
            }
        }
        .navigationViewStyle(.stack) //Style
    }
}

在不必放弃 iPadOS 中的双列布局的情况下,我使用了以下条件视图构建器来根据水平大小使用不同的导航样式 class。

(虽然conditional view builders经常不能很好的配合动画,但是用在这里好像还可以)

extension View {
    @ViewBuilder func `if`<TrueContent: View>(
        _ condition: Bool,
        then trueContent: (Self) -> TrueContent
    ) -> some View {
        if condition {
            trueContent(self)
        } else {
            self
        }
    }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink("link") {
                Text("hi")
            }
        }
        .if(UIDevice.current.userInterfaceIdiom == .phone) {
            [=10=].navigationViewStyle(.stack)
        }
    }
}

P.S。每次旋转后适当调整场景大小时,在 iPadOS 中也可以重现此问题,但我认为如果不打算重现,这种情况不太可能发生。

最大值使用横向列,您缺少第二列视图。试试这个

struct ContentView: View {
var body: some View {
    NavigationView {
        NavigationLink("link") {
            Text("hi")
        }
         Text("Select a link")
    }
}
}