Обновите NSMenuItem, пока отображается меню хоста

У меня есть NSMenuItem, который мне нужно обновить, чтобы показать прогресс (как Time Machine делает с резервной копией). Проблема в том, что когда я устанавливаю новый title на этот NSMenuItem, а title не меняется.

На самом деле оно меняется, когда я закрываю и снова открываю меню, но я хочу обновить его, пока пользователь смотрит на него.

Я также пытался удалить элемент и повторно вставить его безрезультатно.

Любые указатели?


person gcamp    schedule 10.06.2011    source источник


Ответы (1)


На самом деле это работает без дополнительных усилий, если ваш код обновления запускается в прогоне. циклический режим, который используется во время отслеживания меню. Это NSEventTrackingRunLoopMode, но вы, вероятно, просто хотите использовать NSRunLoopCommonModes, чтобы заголовок пункта меню был правильным, когда меню раскрывается.

Вот простой пример пункта меню foo, который подсчитывает количество секунд с момента запуска приложения:

- (void)doStuff;
{
    static int i = 0;
    [foo setTitle:[NSString stringWithFormat:@"%d", ++i]];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification;
{
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
                                [self methodSignatureForSelector:@selector(doStuff)]];
    [invocation setTarget:self];
    [invocation setSelector:@selector(doStuff)];
    [[NSRunLoop mainRunLoop] addTimer:[NSTimer timerWithTimeInterval:1 invocation:invocation repeats:YES] forMode:NSRunLoopCommonModes];
}
person Nicholas Riley    schedule 10.06.2011
comment
Очень ценный ответ. Это очень распространенная проблема для людей, которые впервые сталкиваются с циклом выполнения меню. - person Rob Napier; 10.06.2011
comment
Вы абсолютно правы, Николай, пытался сделать это с performSelector:afterDelay:, которые работают на NSDefaultRunLoopMode. Большое спасибо за ответ. - person gcamp; 10.06.2011