检查 NSStatusItem 当前是不是显示在 OS X NSStatusBar 主菜单栏中

Posted

技术标签:

【中文标题】检查 NSStatusItem 当前是不是显示在 OS X NSStatusBar 主菜单栏中【英文标题】:Check if an NSStatusItem is currently shown in the OS X NSStatusBar main menubar检查 NSStatusItem 当前是否显示在 OS X NSStatusBar 主菜单栏中 【发布时间】:2012-12-31 18:31:42 【问题描述】:

我的应用在 OS X 菜单栏中放置了一个 NSStatusItem。在某些时候,我想从系统 NSStatusBar 中删除菜单栏图标。 (此时我仍想保留 NSStatusItem,并向其发送消息……只是没有显示。)

我正在使用这种方法从状态栏中删除状态项:

[[NSStatusBar systemStatusBar] removeStatusItem:statusItem];

我想稍后检查 statusItem 当前是否显示在状态栏中。我不希望通过布尔值等来跟踪这一点。

我认为这个检查会起作用:

if ([[NSStatusBar systemStatusBar] isEqualTo:[statusItem statusBar]])

    NSLog(@"statusItem's bar == system bar, before");


NSLog(@"removing from systemStatusBar");
[[NSStatusBar systemStatusBar] removeStatusItem:statusItem];

if ([[NSStatusBar systemStatusBar] isEqualTo:[statusItem statusBar]])

    NSLog(@"statusItem's bar == system bar, after removal");

这个输出:

statusItem's bar == system bar, before removal

removing from systemStatusBar

statusItem's bar == system bar, after removal

所以statusItem的状态栏没有明显变化。

NSStatusBar class reference 似乎不包含任何适用的方法。

有没有办法检查某个 NSStatusItem 是否在主系统栏中?

【问题讨论】:

【参考方案1】:

我找到了私有财产_statusItems。 这是我写的一个小分类,不知道好不好用,大家可以试试。


状态栏类别

@implementation NSStatusBar (statusItemCheck)
- (NSArray *)items 
    return [self valueForKey:@"_statusItems"];

- (BOOL)statusItemIsShown:(NSStatusItem *)statusItem 
    if ([self items]) 
        NSInteger index = [[self items] indexOfObject:statusItem];
        if (index != -1) return YES;
    

    return NO;

@end

编辑

您应该考虑添加BOOL 标志,而不是访问私有方法。 我的类别只是一个例子,如果你想将你的应用上传到 MAS,你一般不应该使用私有方法。

【讨论】:

谢谢你,但我会避免使用私有方法,因为这个应用程序是针对 Mac App Store 的。 BOOL 标志似乎是最好的可用方法。

以上是关于检查 NSStatusItem 当前是不是显示在 OS X NSStatusBar 主菜单栏中的主要内容,如果未能解决你的问题,请参考以下文章

反应原生如何检查组件当前是不是显示在屏幕中

如何检查当前是不是正在显示 UIViewController?

检查 UIView 当前是不是正在制作动画

Kivy - 检查当前是不是显示弹出窗口(因为 Kivy 弹出窗口不是真正的模态(后退按钮/键盘))

检查当前站点是不是为论坛

如何在 Firebreath NPAPI 插件中将 NSMenu 连接到 NSStatusItem,以便在单击状态栏项时出现菜单?