SwiftUI配合UIKit导航时隐藏View1标题且保留View2<Back>按钮如何实现
解决方案
你可以通过自定义View1对应UIHostingController的导航项返回按钮配置实现需求,不需要修改当前导航栏的显示标题:
- 第一步:在View1所属的UIHostingController的
viewDidLoad方法中,做两个配置- 将当前导航项的标题置空,保证View1的导航栏不显示标题
- 自定义当前导航项的
backBarButtonItem,设置标题为"Back",响应事件走系统默认的返回逻辑即可,不需要自定义点击事件
class View1HostingController: UIHostingController<View1> { override func viewDidLoad() { super.viewDidLoad() // 配置当前页导航栏不显示标题 navigationItem.title = "" // 配置下一页的返回按钮显示内容,不影响当前页的标题显示 navigationItem.backBarButtonItem = UIBarButtonItem( title: "Back", style: .plain, target: nil, action: nil ) // 添加你需要的Exit右侧按钮 navigationItem.rightBarButtonItem = UIBarButtonItem( title: "Exit", style: .plain, target: self, action: #selector(exitAction) ) } @objc private func exitAction() { // 你的退出逻辑 } }
- 第二步:View2对应的UIHostingController不需要做额外的导航栏配置,压入导航栈后会自动继承上一个控制器配置的
backBarButtonItem的显示内容,返回按钮就会显示<Back - 第三步:如果需要隐藏View2的导航栏标题,直接在View2的HostingController的
viewDidLoad里设置navigationItem.title = ""即可
原理解释
UINavigationController的返回按钮显示规则是:当前栈顶控制器的返回按钮文本,取的是上一个栈内控制器的backBarButtonItem的title,如果上一个控制器没有自定义backBarButtonItem,才会取上一个控制器的navigationItem.title作为返回按钮文本。所以单独配置backBarButtonItem不会影响当前控制器的标题显示,刚好匹配你的需求。
内容的提问来源于stack exchange,提问作者hbr4u7vb2sljksdf2
相关产品推荐
相关产品推荐

