Bar Button返回RootViewController后无法恢复默认颜色问题
这个问题我之前也碰到过,本质是系统在Segue触发的瞬间,没来得及重置BarButtonItem的高亮状态就完成了页面跳转,导致返回后按钮还停留在按下的视觉状态。下面给你几个靠谱的解决办法:
方法1:在返回时手动重置按钮状态
在你的RootViewController里重写viewWillAppear(_:)方法,强制把按钮的高亮状态关掉:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 假设你的BarButtonItem是用IBOutlet连接的,名字叫segueButton segueButton.isHighlighted = false }
如果是用代码创建的按钮,直接找到对应的BarButtonItem,操作它的isHighlighted属性即可。
方法2:改用Action手动跳转,替代Segue绑定
放弃直接给BarButtonItem绑定Segue,而是给按钮加一个点击事件,在事件里手动push目标ViewController:
@IBAction func segueButtonTapped(_ sender: UIBarButtonItem) { let targetVC = storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController navigationController?.pushViewController(targetVC, animated: true) }
这种方式下,系统会正常处理按钮的触摸状态,跳转完成后按钮会自动恢复到正常样式,返回时也不会有残留的按下状态。
方法3:用自定义UIButton做BarButtonItem
如果你的导航栏按钮需要自定义样式,干脆直接用UIButton来创建BarButtonItem,这样能更精准控制按钮状态:
let customButton = UIButton(type: .system) customButton.setTitle("SegueButton", for: .normal) customButton.addTarget(self, action: #selector(segueButtonTapped), for: .touchUpInside) let barButtonItem = UIBarButtonItem(customView: customButton) navigationItem.rightBarButtonItem = barButtonItem
自定义按钮的状态管理会更可靠,不会出现系统默认BarButtonItem的状态残留问题。
你可以根据自己的项目情况选其中一种方法,亲测都能解决这个问题~
内容的提问来源于stack exchange,提问作者tttemplar
相关产品推荐
相关产品推荐

