2012-11-30 3 views
1

Я работаю над приложением. В этом приложении есть несколько NSWindows и один StatusItem для доступа к любому из NSWindows, когда они не открыты. Некоторые из этих окон постоянно обновляют свой интерфейс новыми номерами и статусами. Проблема в том, что всякий раз, когда я нажимаю StatusItem в строке состояния системы, он блокирует обновления в окнах, и я не вижу никаких обновлений, пока не закрою StatusMenu.NSStatusItem Blocks Обновления пользовательского интерфейса в NSWindows

ответ

3

Это примерно Run Loop Modes.

Отложенные операции, которые выполняются в основном потоке, обычно назначаются для NSDefaultRunLoopMode основного цикла запуска, что означает, что он не запускается при открытии меню или модального диалога. Вместо этого вам нужно использовать NSRunLoopCommonModes, что позволит им работать как в режимах по умолчанию, так и в режиме отслеживания событий (меню, диалоги).

Например:

  • если вы используете NSTimer огонь события обновления, вместо scheduledTimerWithTimeInterval, используйте timerWithTimeInterval в сочетании с [[NSRunLoop currentRunLoop] addTimer:theTimer forMode:NSRunLoopCommonModes].

  • если вы используете performSelectorOnMainThread:withObject:waitUntilDone:, вместо того, чтобы использовать performSelectorOnMainThread:withObject:waitUntilDone:modes:, передавая [NSArray arrayWithObject:NSRunLoopCommonModes] для modes: аргумента.

+0

Благодарим вас за ответ. Поскольку написана большая часть моего кода приложения, существует ли способ применить NSRunLoopCommonModes к селекторам, не пройдя этот процесс или каким-то образом изменив режим RunMonu StatusMenu? –

+0

@AbcdEfg Боюсь, нет. Невозможно запустить меню состояния в другом режиме, вам нужно изменить способ планирования таймеров и селекторов. – hamstergene