2

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

我正在使用此方法从状态栏中删除 statusItem:

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

NSStatusBar类引用似乎不包含任何适用的方法。

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

4

1 回答 1

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,你一般不应该使用私有方法。

于 2012-12-31T18:45:30.730 回答