【问题标题】:SwiftUI Navigation bar items disappear on iOS 14SwiftUI 导航栏项目在 iOS 14 上消失
【发布时间】:2020-12-08 08:16:54
【问题描述】:

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

出现这种情况的示例 sn-p:

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)在模拟器上一切正常。

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

【问题讨论】:

  • 几周前我也遇到过类似的问题。 UIBarButtonItems 没有专门显示图像。您能否确认模拟器和您的设备运行的是相同版本的 iOS?因为这是解决我的问题。
  • 是的,我的模拟器和 iPhone 都在运行 iOS 14.2。此外,添加为 navigationBarItem 的视图类型是什么也没有关系。即使它只包含一个文本视图,它的行为也类似,并且当方向改变时视图会被隐藏。
  • 抱歉,我的意思是在声明一个完全加载的 UIBarButtonItem 实例时可以作为参数传入的实际 UIImage 属性。例如,“
  • 但是,鉴于更新不是您的问题,您是否尝试过蛮力覆盖 BarButtonItem 以在 detailView 中给出问题,以查看它是否有效?
  • 能否请您澄清您所说的“蛮力覆盖 BarButtonItem 给出问题的 detailView 只是为了看看它是否有效?”

标签: swiftui ios14 swiftui-navigationlink swiftui-navigationview


【解决方案1】:

.navigationBarTitle and .navigationBarItems 已被弃用。我认为最好的“修复”是切换到.toolbar

【讨论】:

  • 这可能会解决问题。不幸的是,这对我来说还不可能,因为我们仍在使用 Xcode 11 将构建提交到应用商店。 (一些外部库在 Xcode 12 上存在问题)
  • 我正在使用navigationTitle,它没有被弃用——但仍然看到导航栏项目消失。似乎与轮换无关。到目前为止,我只能在 iPad 上看到它。
【解决方案2】:

这是一个奇怪的问题,但我想有一个 hack 可以让它工作。 发生旋转时,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")
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多