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

如何自定义UINavigationViewController返回按钮且不传递样式给后续控制器?

解决方法

方案一:自定义返回按钮(最直接,不影响后续页面)

在第二个ViewController的viewDidLoad里直接替换系统返回按钮,完全自定义样式和逻辑:

override func viewDidLoad() {
    super.viewDidLoad()
    
    // 创建仅含文字的Cancel按钮
    let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelTapped))
    navigationItem.leftBarButtonItem = cancelButton
}

@objc private func cancelTapped() {
    // 手动触发返回上一页
    navigationController?.popViewController(animated: true)
}

这种方式完全独立于系统返回按钮逻辑,后续push的第三个ViewController会正常显示默认的< Back按钮,不会受任何影响。

方案二:临时隐藏箭头(复用系统返回逻辑)

如果不想自己写返回逻辑,可以在当前VC显示时临时修改导航栏样式,离开后立即恢复:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    // 清空返回按钮箭头图片
    navigationController?.navigationBar.backIndicatorImage = UIImage()
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage()
    // 设置返回按钮文字为Cancel
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "Cancel", style: .plain, target: nil, action: nil)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    
    // 恢复导航栏默认箭头样式
    navigationController?.navigationBar.backIndicatorImage = nil
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = nil
    // 清空自定义返回文字,让后续页面正常显示默认返回样式
    navigationItem.backBarButtonItem = nil
}

利用页面生命周期的钩子,只在第二个VC显示时修改样式,离开后自动还原,不会影响第三个VC的< Back按钮。

避坑提醒

不要全局修改UINavigationBar.appearance()的样式,否则会导致所有页面的返回按钮箭头都消失,不符合你仅修改单个页面的需求。

内容的提问来源于stack exchange,提问作者Mercutio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:45:35