在SwiftUI中如何移除返回按钮上的文本

10
简而言之,我想使用SwiftUI来实现这个

enter image description here

(首页应该被移除)

到目前为止,我还没有找到直接访问NavigationBarButton的方法,我已经找到了以下似乎是迄今为止修改按钮的唯一方法:

struct MyList: View {
    var body: some View {
            Text("MyList")
            .navigationBarTitle(Text(verbatim: "MyList"), displayMode: .inline)
            .navigationBarItems(leading: Text("<"))
    }
}

然而,我失去了默认返回的图片并得到了一个丑陋的<。

enter image description here

5个回答

7
你需要设置视图的标题,才能使返回按钮生效:
struct ContentView: View {    
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: DetailView()) {
                    Text("push view")
                }
            }.navigationBarTitle("", displayMode: .inline)
        }
    }
}

struct DetailView: View {    
    var body: some View {
        Text("Detail View")
    }
}

如果需要根据展示状态有条件地设置或取消源视图的标题,您可以使用以下代码。

请注意,isActive参数存在一个bug,但很可能很快就会得到解决。这里有一个提到该bug的参考SwiftUI:NavigationDestinationLink已弃用

struct ContentView: View {
    @State private var active: Bool = false

    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: DetailView(), isActive: $active) {
                    Text("push view")
                }
            }.navigationBarTitle(!active ? "View Title" : "", displayMode: .inline)
        }
    }
}

struct DetailView: View {
    var body: some View {
        Text("Detail View")
    }
}

4
虽然这解决了眼前的问题,但也带来了新的问题。现在,“源”视图控制器在导航栏中没有标题。 - Ashley Mills
1
添加了另一种选择。 - kontiki
谢谢@kontiki,这个完美地运行了,除了你指出的那个bug。 - CodeBender
在2021年不起作用。"displayMode: .inline"不起作用,而在单独的一行上添加navigationBarTitleDisplayMode(.inline)也不起作用。 - johnrubythecat
我发现这对我有效,只要1)从!active中移除!,2)将调用navigationBarTitle()更改为navigationTitle(),以及3)将.inline规范放在自己的代码行中,如.navigationBarTitleDisplayMode(.inline) - bruce1337

2
不要去修改上一个屏幕的标题,你可以在导航栏中简单地添加一个“主要”项目,并使其占据足够的空间,以至于没有空间显示返回按钮的文本。SwiftUI会自动继续显示返回按钮,但隐藏其文本。
.toolbar {
  ToolbarItem(placement: .principal) { Color.clear }
}

0
如果你想要使用 iOS 16 NavigationStack 并且需要隐藏返回按钮的标题,你可以通过设置 toolbarRoleeditor 来实现这个简单的解决方案。
.toolbarRole(.editor)

例如:

struct SecondView: View {
    var body: some View {
        Text("Hello Second View")
            .navigationTitle("Second View")
            .toolbarRole(.editor)
    }
}

输出结果将如下所示:

Hide Back Button


0
SwiftUI的工具栏修饰符比navigationBar修饰符更灵活。您不仅限于使用字符串或Text视图作为参数。使用内置的环境操作"dismiss"代替返回按钮。具有动态功能,非常出色。
struct MyList: View {
    @Environment(\.dismiss) var dismiss
    var body: some View {
        Text("Hello, World!")
            .toolbar {
                ToolbarItem(placement: .navigationBarLeading) {
                    Button {
                        dismiss()
                    } label: {
                        Text("<")
                    }
                }
                ToolbarItem(placement: .principal) {
                    Text("MyList")
                }
            }
            .navigationBarBackButtonHidden(true)
    }
}

-1

iOS 16 上可用

由于您可以在视图的 init 中更新 NavigationItem,因此您可以通过以下 2 步解决此问题:

  1. 获取可见视图控制器。
// Get Visible ViewController
extension UIApplication {
    
    static var visibleVC: UIViewController? {
        var currentVC = UIApplication.shared.windows.first { $0.isKeyWindow }?.rootViewController
        while let presentedVC = currentVC?.presentedViewController {
            if let navVC = (presentedVC as? UINavigationController)?.viewControllers.last {
                currentVC = navVC
            } else if let tabVC = (presentedVC as? UITabBarController)?.selectedViewController {
                currentVC = tabVC
            } else {
                currentVC = presentedVC
            }
        }
        return currentVC
    }
    
}

在视图的init方法中更新NavigationItem。
struct YourView: View {
    
    init(hideBackLabel: Bool = true) {
        if hideBackLabel {
            // iOS 14+
            UIApplication.visibleVC?.navigationItem.backButtonDisplayMode = .minimal
            
            // iOS 13-
            let button = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
            UIApplication.visibleVC?.navigationItem.backBarButtonItem = button
        }
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接