Проверьте, отображается ли NSStatusItem в настоящее время в главном меню OS X NSStatusBar.

Мое приложение помещает NSStatusItem в строку меню OS X. В какой-то момент я хочу удалить значок строки меню из системного 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 не содержит применимых методов.

Есть ли способ проверить, находится ли определенный NSStatusItem в главной системной панели?


person ck_    schedule 31.12.2012    source источник


Ответы (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, вам обычно не следует использовать частные методы.

person IluTov    schedule 31.12.2012
comment
Спасибо за это, но я буду избегать использования частных методов, так как это приложение предназначено для Mac App Store. Флаг BOOL кажется лучшим доступным методом. - person ck_; 05.01.2013