macOS状态栏图标按钮类NSStatusBarButton
macOS状态栏图标按钮类NSStatusBarButton

macOS状态栏图标按钮类NSStatusBarButton

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/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注