2

私のアプリは、OS X メニューバーに NSStatusItem を配置します。ある時点で、システム 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クラス リファレンスには、該当するメソッドが含まれていないようです。

特定の 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 に答える