1

在我的应用程序中发现,当设备方向改变时,某些视图中的导航栏项目会消失。这似乎只发生在使用 NavigationLink 打开的视图中,主视图导航栏项目按预期工作。与此相关的 iOS 13.7 和 iOS 14.2 之间似乎发生了一些变化。此外,使用前导项还是尾随项似乎并不重要,两者都会消失。

发生这种情况的示例片段:

struct ContentView: View {
    var detailView: some View {
        Text("This is detail view")
            .navigationBarTitle("Detail view title", displayMode: .inline)
            .navigationBarItems(trailing: Button(action: {}, label: {
                Image(systemName: "pencil.circle.fill")
            }))
    }

    var body: some View {
        NavigationView {
            NavigationLink(
                destination: detailView,
                label: {
                    Text("Open detail view")
                })
                .navigationBarTitle("Main view")
        }.navigationViewStyle(StackNavigationViewStyle())
    }
}

这是发生的事情

只有在真实设备上运行时才会出现此问题。(在我的情况下是 iPhone 11)在模拟器上一切都按预期工作。

其他人看到过类似的问题吗?解决方法/修复?

4

2 回答 2

3

.navigationBarTitle并且.navigationBarItems正在被弃用。我认为最好的“修复”是切换到.toolbar

于 2020-12-08T12:48:01.153 回答
0

这是一个奇怪的问题,但我想有一个黑客可以让它工作。发生旋转时,SwiftUI 不会调用 body 属性。因此,您可以将 @State UIDeviceOrientation 属性添加到您的视图中,并在每次方向更改时更新它。一件棘手的事情是在视图主体的某处使用该属性,因为 SwiftUI 足够聪明,可以忽略主体中未使用的 @State。

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(
                destination: DetailsView(),
                label: {
                    Text("Open detail view")
                }).navigationBarTitle("Main view")
        }.navigationViewStyle(StackNavigationViewStyle())
    }
}
struct DetailsView: View {
    @State var orientation: UIDeviceOrientation = UIDevice.current.orientation

    var body: some View {
        Text("This is detail view")
            .navigationBarTitle("Detail view title")
            .navigationBarItems(trailing: button)
            .onReceive(NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)) { _ in
                orientation = UIDevice.current.orientation
            }.background(Text("\(orientation.rawValue)"))
    }

    var button: some View {
        Button(action: { print("123") }, label: {
            Image(systemName: "pencil.circle.fill")
        }).id("123")
    }
}
于 2021-08-12T08:19:07.020 回答