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

时间:2012-12-31 18:31:42

标签: objective-c macos cocoa menubar nsstatusitem

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

我正在使用此方法从statusBar中删除statusItem:

[[NSStatusBar systemStatusBar] removeStatusItem:statusItem];

我想稍后检查statusItem当前是否显示在statusBar中。我宁愿不通过布尔值等跟踪这个。

我认为这项检查有效:

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的statusBar没有明显的变化。

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

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

1 个答案:

答案 0 :(得分: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,通常不应使用私有方法。