【问题标题】:Swift UI Clicking navigation bar link hides status bar on backSwift UI 单击导航栏链接隐藏状态栏在后面
【发布时间】:2021-11-08 21:23:01
【问题描述】:

我编写了一个简单的 Swift UI 应用程序,它在导航工具栏上创建一个 NavigationLink,并在显示屏底部创建一个状态栏。单击导航栏上的齿轮链接时,它会将您带到子视图,但是当您返回父视图时,状态栏会被隐藏。如果单击屏幕中间的 NavigationLink 并返回父视图,状态栏会再次显示。

这看起来像是 Swift UI 中的一个错误,有人知道如何修复吗?

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: Text("Child view")) {
                Text("Hello, World!")
            }
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing, content: { 
                    NavigationLink(destination: Text("Settings view"),
                        label: { Image(systemName: "gearshape.fill")
                    })
                })
                ToolbarItem(placement: .status, content: {
                    Text("Checking for messages...") 
                })
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

【问题讨论】:

  • 我在 Xcode 12.5 上没有看到这个。尝试重新启动一切?
  • 也适用于 Xcode 13 / iOS 15。
  • 我正在使用 Xcode 12.5.1 并尝试重新启动我的 Mac。奇怪,我可以在 Xcode Live Preview、iPhone 8/iPhone 12 mini 模拟器和我的 iPhone 6s 设备上重现。
  • 那么您的问题可能出在 App.swift 或链条的下游。尝试开始一个新的空白项目并将其放入。

标签: ios swiftui statusbar toolbaritems


【解决方案1】:

问题在于 Swift UI 无法在工具栏中正确处理 NavigationLink

解决方法是将Button 放入工具栏中,并在代码中使用隐藏的NavigationLink

这是解决我的问题的答案的链接。 SwiftUI - Make toolbar's NavigationLink use detail view

这是使用解决方法实现我的原始代码的代码。

struct ContentView: View {
    @State var settingsLinkSelected = false
    var body: some View {
        NavigationView {
            NavigationLink(destination: Text("Second view")) {
                Text("Hello, World!")
            }
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing,
                            content: { Button(action: { settingsLinkSelected = true },
                            label: { Image(systemName: "gearshape.fill") }) })
                ToolbarItem(placement: .status, 
                            content: { Text("Checking for messages...") })
            }
            .background(
                NavigationLink(
                    destination: Text("Settings View"),
                    isActive: $settingsLinkSelected
                ) {
                    EmptyView()
                }.hidden()
            )
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多