如何自定义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
相关产品推荐
相关产品推荐

