NSTimer с приложением строки меню

Я работаю над простым приложением таймера, и я создал NSStatusItem с меню, и у меня есть несколько меток NSTextField, которые обновляют метки таймера (http://cld.ly/e81dqm), но когда я нажимаю на элемент состояния, NSTimer останавливается (и перестает обновлять метки) ..... как я могу обойти эту проблему?

РЕДАКТИРОВАТЬ: вот код, запускающий таймер:

timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerDidUpdate:) userInfo:nil repeats:YES];


person nanochrome    schedule 13.02.2010    source источник
comment
Собираюсь увидеть код, в котором вы запускаете и останавливаете таймер. Вы имеете в виду, что таймер обновляет метки?   -  person TechZen    schedule 14.02.2010
comment
и он перестает обновляться, когда я нажимаю на элемент состояния, не знаю, что не так.   -  person nanochrome    schedule 14.02.2010


Ответы (2)


Я предполагаю, что таймер возобновит работу, как только вы перестанете взаимодействовать с NSStatusItem? (После закрытия меню и отпускания кнопки мыши).

Взаимодействие с пользователем переводит основной цикл выполнения в режим, в котором таймеры не обновляются, поэтому, если ваша метка должна постоянно обновляться, вам, вероятно, потребуется переместить NSTimer и рисунок метки в отдельный процесс или другой поток.

person Josh Freeman    schedule 14.02.2010
comment
Извините, я новичок в obj-c / cocoa, как мне перейти к другому потоку и т. Д. - person nanochrome; 14.02.2010
comment
Если вы раньше не делали потоки, вам потребуется немного почитать: Руководство по программированию потоков: tinyurl.com/yjnlegr Потоки и графические контексты: tinyurl.com/yflqjjk Более простым решением может быть создание делегата для ваше меню, затем реализуйте методы делегата menuWillOpen: & menuDidClose: для очистки метки / представления при открытом меню (чтобы, по крайней мере, пользователь не видел устаревшую метку). - person Josh Freeman; 14.02.2010

Вы должны добавить таймер в MainRunLoop, как показано ниже:

NSRunLoop * rl = [NSRunLoop mainRunLoop];
[rl addTimer:timer forMode:NSRunLoopCommonModes];
person Qaisar Majeed    schedule 24.02.2011
comment
Это действительно кажется предпочтительным ответом. - person Daniel Wabyick; 15.01.2016
comment
Это, пожалуй, самый простой способ сделать это. Кроме того, вы можете просто сделать это в одной строке с [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; - person SilverWolf; 18.09.2017