调用popToMainViewController后MainViewController自定义右侧导航栏按钮不显示
问题解决:返回MainViewController后右侧导航栏按钮不显示
问题原因分析
- 自定义pop方法逻辑冗余:原方法通过window获取根导航控制器再查找MainViewController,虽多数情况下操作的是同一栈,但逻辑绕路且存在潜在的实例不一致风险。
- 自定义按钮未设置尺寸:使用
UIButton作为UIBarButtonItem的customView时,未明确设置按钮的frame或约束,导致pop返回时按钮因无尺寸而无法显示(首次启动时导航栏布局流程可能自动补全尺寸,但回退时未触发该逻辑)。
修复方案
1. 简化自定义pop方法
将原UINavigationController扩展修改为直接从当前导航栈查找目标控制器:
extension UINavigationController { func popToMainViewController(animated: Bool) { // 直接从当前导航栈中查找MainViewController实例 if let mainViewController = viewControllers.first(where: { $0 is MainViewController }) { popToViewController(mainViewController, animated: animated) } } }
2. 给自定义导航栏按钮设置明确尺寸
修改configureSettingBtn和configureNavBarItems方法,为按钮添加固定尺寸:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) configureSettingBtn() configureNavBarItems() } func configureSettingBtn() { let settingImage = UIImage(named: "settingIcon") let settingBtn = UIButton(type: .custom) // 设置按钮固定尺寸,匹配图片大小 settingBtn.frame = CGRect(x: 0, y: 0, width: 24, height: 24) settingBtn.setImage(settingImage, for: .normal) settingBtn.addTarget(self, action: #selector(settingApp), for: .touchUpInside) let setting = UIBarButtonItem(customView: settingBtn) self.navigationItem.rightBarButtonItems = [setting] } private func configureNavBarItems() { print("configuring nav bar items") let spacer = createSpacer() let infoImage = UIImage(named: "infoIcon") let infoBtn = UIButton(type: .custom) // 设置按钮固定尺寸 infoBtn.frame = CGRect(x: 0, y: 0, width: 24, height: 24) infoBtn.setImage(infoImage, for: .normal) infoBtn.addTarget(self, action: #selector(guide), for: .touchUpInside) let info = UIBarButtonItem(customView: infoBtn) navigationItem.rightBarButtonItems?.append(contentsOf: [spacer, info]) }
可选优化:使用约束替代固定frame
如果需要适配不同尺寸,也可以用AutoLayout约束代替固定frame:
// 以settingBtn为例 settingBtn.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ settingBtn.widthAnchor.constraint(equalToConstant: 24), settingBtn.heightAnchor.constraint(equalToConstant: 24) ])
验证要点
- 确保
viewWillAppear方法正常调用(你已确认此点) - 检查导航栏的
isHidden属性为false - 确认
hidesBackButton设置不影响右侧按钮显示(你已设置为true,此配置无问题)
内容的提问来源于stack exchange,提问作者nakim81
相关产品推荐
相关产品推荐

