NSStatusBarButton 是 macOS 菜单栏图标按钮的类,用于显示在系统右上角菜单栏中的图标,是 NSStatusItem 的 button 属性所返回的对象。
NSStatusBarButton 是显示在菜单栏上的按钮视图,继承自 NSButton,可用于设置图标、响应点击、设置工具提示等。

它和 NSStatusItem 的关系?
let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
let button = statusItem.button
statusItem 是模型对象(控制图标、菜单)。
button 是 UI 对象(看到和点到的部分)。
button 是 NSStatusBarButton? 类型的,可选属性。
它在 statusItem.menu == nil 的时候,可以用来响应点击事件。
常用属性
1、image:设置图标(推荐使用模板图片)。
button.image = NSImage(named: "Icon")

2、title:设置按钮文字(可与图标并存)。
button.title = "Demo"

3、action:设置点击后触发的方法。
button.action = #selector(handleClick)
注意:需要搭配 target 使用,否则action设置的方法无效。
4、target:设置事件响应对象。
button.target = self
注意:需要搭配 action: #selector(…) 使用,否则点击无效。
statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
if let button = statusItem.button {
button.image = NSImage(named: "templateIcon")
button.toolTip = "轻压图片"
button.action = #selector(clickButton) // action
button.target = self // target
}
@objc func clickButton() {
print("点击了状态栏图标")
NSApp.activate(ignoringOtherApps: true)
}
如果不设置target,系统会沿着响应链(responder chain)查找能响应 #selector(openWindow) 的对象,可能找不到,导致点击无效。
当然,也有特殊的场景,例如:
// 创建系统菜单栏图标
statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
if let button = statusItem.button {
button.image = NSImage(named: "templateIcon")
button.toolTip = "轻压图片"
button.action = #selector(NSApp.terminate(_:))
}
虽然NSStatusBarButton没有设置target,但仍然可以实现菜单功能。
这是因为,系统执行的逻辑为:自动沿“响应链”查找一个可以响应这个 action 的对象,直到找到为止。
对于 #selector(NSApp.terminate(_:)) 这种系统方法,系统能自动识别这是 NSApplication 提供的方法,于是就自动把 target 设置为 NSApp。
因此,如果是自己编写的方法,就需要设置target,如果是NSApp这种可以沿“响应链”查找到响应action的对象,就不需要单独再设置target。
5、toolTip:悬停时的提示文字。
button.toolTip = "这是一个状态栏图标"

6、appearsDisabled:显示禁用样式
button.appearsDisabled = true

示例代码
let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
if let button = statusItem.button {
button.image = NSImage(named: "templateIcon")
button.image?.isTemplate = true
button.toolTip = "点击打开菜单"
button.action = #selector(buttonClicked)
button.target = self
}
总结
1、NSStatusBar:创建/移除菜单栏项的管理器。
2、NSStatusItem:表示菜单栏上的一个图标项。
3、NSStatusBarButton:图标的可见按钮视图,可以设置图标、文字、点击行为。
图标的配置和模版图部分,详情请见《macOS状态栏图标(系统右上角)NSStatusBar》的设置状态栏图标部分。
相关文章
1、macOS状态栏图标(系统右上角)NSStatusBar:https://fangjunyu.com/2025/06/24/macos%e7%8a%b6%e6%80%81%e6%a0%8f%e5%9b%be%e6%a0%87%ef%bc%88%e7%b3%bb%e7%bb%9f%e5%8f%b3%e4%b8%8a%e8%a7%92%ef%bc%89nsstatusbar/
2、macOS状态栏图标关键组件NSStatusItem:https://fangjunyu.com/2025/06/26/macos%e8%8f%9c%e5%8d%95%e6%a0%8f%e5%9b%be%e6%a0%87%e5%85%b3%e9%94%ae%e7%bb%84%e4%bb%b6nsstatusitem/