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

如何添加响应式UIBarButtonItem?自定义按钮选中状态判断方法

如何实现响应式UIBarButtonItem并点击切换图片

一、添加响应式UIBarButtonItem

其实UIBarButtonItem本身的交互灵活性有限,我通常会用UIButton作为它的自定义视图来实现响应式效果——毕竟UIButton天然支持各种状态和交互逻辑,步骤很简单:

  • 先创建一个UIButton实例,设置好尺寸(导航栏按钮标准尺寸是44x44)、默认图片/文字等样式
  • 给按钮绑定点击事件
  • 把这个按钮作为customView传入UIBarButtonItem的初始化方法
  • 最后将这个UIBarButtonItem添加到导航栏的左侧或右侧按钮组里

给你个Swift代码示例参考:

// 创建自定义按钮
let customButton = UIButton(type: .custom)
customButton.frame = CGRect(x: 0, y: 0, width: 44, height: 44)
customButton.setImage(UIImage(named: "normal_icon"), for: .normal)
customButton.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)

// 包装成UIBarButtonItem
let customBarItem = UIBarButtonItem(customView: customButton)

// 添加到导航栏右侧
navigationItem.rightBarButtonItem = customBarItem

如果你的项目是iOS 13及以上,也可以直接用UIBarButtonItem(title:image:primaryAction:)来绑定动作,但自定义样式的话,还是UIButton的方式更可控。

二、点击切换图片并判断选中状态

你说得没错,UIBarButtonItem本身确实没有isTapped或isSelected属性,但我们可以借助它的customView(也就是上面的UIButton)来解决——UIButton自带isSelected状态,刚好能满足需求:

  1. 初始化按钮时,提前设置好normal和selected两种状态的图片
  2. 在点击事件里直接切换按钮的isSelected属性
  3. 通过按钮的isSelected就能直接判断当前是否处于选中状态

代码示例如下:

// 初始化时设置两种状态的图片
customButton.setImage(UIImage(named: "normal_icon"), for: .normal)
customButton.setImage(UIImage(named: "selected_icon"), for: .selected)

// 点击事件处理
@objc func buttonTapped(_ sender: UIButton) {
    // 切换选中状态
    sender.isSelected.toggle()
    
    // 根据状态做后续逻辑
    if sender.isSelected {
        print("按钮现在是选中状态")
    } else {
        print("按钮现在是未选中状态")
    }
}

要是你不想用UIButton自带的状态,也可以自己在ViewController里维护一个布尔变量,比如private var isBarItemSelected = false,每次点击时切换这个变量,再手动设置按钮图片:

@objc func buttonTapped(_ sender: UIButton) {
    isBarItemSelected.toggle()
    let imageName = isBarItemSelected ? "selected_icon" : "normal_icon"
    sender.setImage(UIImage(named: imageName), for: .normal)
}

不过我更推荐用UIButton自带的状态管理,代码更简洁,也符合iOS控件的设计逻辑。

内容的提问来源于stack exchange,提问作者A.M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 07:03:17