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

切换UIBarButtonItem后按钮未高亮/褪色问题求助

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:35:26