You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用popToMainViewController后MainViewController自定义右侧导航栏按钮不显示

问题解决:返回MainViewController后右侧导航栏按钮不显示

问题原因分析

  1. 自定义pop方法逻辑冗余:原方法通过window获取根导航控制器再查找MainViewController,虽多数情况下操作的是同一栈,但逻辑绕路且存在潜在的实例不一致风险。
  2. 自定义按钮未设置尺寸:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:57:50