导航栏返回按钮未显示:Popover控制器跳转后的返回按钮添加问题
解决UIPopover中视图控制器跳转后的返回按钮问题
你遇到的核心问题应该是跳转后的视图控制器不在导航栈上下文里,导致手动添加的返回按钮没法触发正确的返回逻辑。下面给你两种针对性的解决方案:
方案一:用导航控制器包裹Popover的根控制器(推荐)
这是最规范的实现方式,能让popover内的视图控制器自动拥有导航栈,返回按钮也会自动生成:
修改Popover的展示代码
把你的第一个视图控制器(简称VC1)包裹在UINavigationController中,再作为popover展示:// 实例化你的第一个视图控制器 let firstVC = YourFirstViewController() // 用导航控制器包裹它 let navController = UINavigationController(rootViewController: firstVC) // 设置popover展示样式 navController.modalPresentationStyle = .popover // 配置popover的触发源(必须设置,否则popover可能无法正确显示) if let popoverPC = navController.popoverPresentationController { popoverPC.sourceView = yourTriggerView // 比如触发popover的按钮或视图 popoverPC.sourceRect = yourTriggerView.bounds // 可选:设置popover的箭头方向 popoverPC.permittedArrowDirections = .any } // 展示popover present(navController, animated: true)在VC1中跳转第二个视图控制器(VC2)
用pushViewController方式跳转(或者在Storyboard中设置Show类型的segue):// 在VC1的跳转方法中 let secondVC = YourSecondViewController() navigationController?.pushViewController(secondVC, animated: true)这样VC2的
navigationItem会自动生成返回按钮,无需手动添加,点击就能回到VC1。
方案二:手动添加返回按钮(适用于无法用导航栈的场景)
如果因为某些限制不能用导航控制器包裹,你可以在VC2中手动添加返回按钮,并通过对应逻辑返回:
在VC2的viewDidLoad中添加返回按钮
override func viewDidLoad() { super.viewDidLoad() // 创建自定义返回按钮 let backBtn = UIBarButtonItem(title: "返回", style: .plain, target: self, action: #selector(backToFirstVC)) navigationItem.leftBarButtonItem = backBtn }实现返回逻辑
根据你跳转VC2的方式选择对应的代码:- 如果是用
push跳转(VC2在导航栈中):@objc func backToFirstVC() { navigationController?.popViewController(animated: true) } - 如果是用
present跳转(VC2是模态弹出的):@objc func backToFirstVC() { dismiss(animated: true) }
- 如果是用
额外排查要点
- 检查你跳转VC2的segue类型:如果是
Present Modally,VC2不在导航栈中,popViewController会无效,这时候必须用dismiss。 - 确保VC2的
navigationItem没有被其他代码覆盖,比如是否在其他生命周期方法里重新设置了导航栏按钮。
内容的提问来源于stack exchange,提问作者Iserlohn
相关产品推荐
相关产品推荐

