切换UIBarButtonItem后按钮未高亮/褪色问题求助
这个问题我之前做项目时也碰到过!本质是切换按钮的时候系统没有自动重置按钮的交互状态,或者创建按钮的方式导致状态没被正确管理。给你几个靠谱的解决思路:
1. 切换时强制重置按钮状态
有时候切换按钮后,系统不会自动清除之前的高亮状态,手动重置一下就能恢复正常:
@objc func btnEditTapped() { // 你的原有逻辑(比如开启编辑模式) textFieldView.isEditable = true // 切换按钮 navigationItem.rightBarButtonItem = btnSave // 强制重置按钮状态 btnSave.isHighlighted = false // 可选:让导航栏重新布局,确保状态生效 navigationController?.navigationBar.setNeedsLayout() } @objc func btnSaveTapped() { // 你的原有逻辑(比如保存内容) textFieldView.isEditable = false // 切换回编辑按钮 navigationItem.rightBarButtonItem = btnEdit btnEdit.isHighlighted = false navigationController?.navigationBar.setNeedsLayout() }
2. 检查UIBarButtonItem的创建方式
如果你的按钮是用自定义UIButton作为customView创建的,很可能是按钮的状态属性没设置对:
// 正确创建编辑按钮的示例 let editBtn = UIButton(type: .system) editBtn.setTitle("Edit", for: .normal) editBtn.addTarget(self, action: #selector(btnEditTapped), for: .touchUpInside) // 确保高亮状态正常响应 editBtn.adjustsImageWhenHighlighted = true editBtn.adjustsImageWhenDisabled = false btnEdit = UIBarButtonItem(customView: editBtn) // 保存按钮同理 let saveBtn = UIButton(type: .system) saveBtn.setTitle("Save", for: .normal) saveBtn.addTarget(self, action: #selector(btnSaveTapped), for: .touchUpInside) saveBtn.adjustsImageWhenHighlighted = true btnSave = UIBarButtonItem(customView: saveBtn)
如果是用系统自带的初始化方法(比如init(title:style:target:action:)),那用第一种方法基本就能解决问题。
3. 更优雅的方案:复用单个按钮
其实没必要创建两个独立的UIBarButtonItem,可以只维护一个按钮,点击时切换标题和对应的事件,状态管理会简单很多:
var rightBarBtn: UIBarButtonItem! var isEditing = false override func viewDidLoad() { super.viewDidLoad() // 初始化默认按钮 rightBarBtn = UIBarButtonItem(title: "Edit", style: .plain, target: self, action: #selector(toggleEditMode)) navigationItem.rightBarButtonItem = rightBarBtn } @objc func toggleEditMode() { isEditing.toggle() if isEditing { rightBarBtn.title = "Save" rightBarBtn.action = #selector(saveContent) textFieldView.isEditable = true } else { rightBarBtn.title = "Edit" rightBarBtn.action = #selector(toggleEditMode) textFieldView.isEditable = false } // 重置状态 rightBarBtn.isHighlighted = false } @objc func saveContent() { // 你的保存逻辑 isEditing.toggle() rightBarBtn.title = "Edit" rightBarBtn.action = #selector(toggleEditMode) textFieldView.isEditable = false rightBarBtn.isHighlighted = false }
先试试第一种方法,大概率能快速解决褪色问题;如果是自定义按钮的问题,再检查第二个点。第三种方案是长期维护更省心的写法,推荐尝试~
内容的提问来源于stack exchange,提问作者gsp1294
相关产品推荐
相关产品推荐

