Я работаю над приложением. В этом приложении есть несколько NSWindows и один StatusItem для доступа к любому из NSWindows, когда они не открыты. Некоторые из этих окон постоянно обновляют свой интерфейс новыми номерами и статусами. Проблема в том, что всякий раз, когда я нажимаю StatusItem в строке состояния системы, он блокирует обновления в окнах, и я не вижу никаких обновлений, пока не закрою StatusMenu.NSStatusItem Blocks Обновления пользовательского интерфейса в NSWindows
ответ
Это примерно 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:
аргумента.
Благодарим вас за ответ. Поскольку написана большая часть моего кода приложения, существует ли способ применить NSRunLoopCommonModes к селекторам, не пройдя этот процесс или каким-то образом изменив режим RunMonu StatusMenu? –
@AbcdEfg Боюсь, нет. Невозможно запустить меню состояния в другом режиме, вам нужно изменить способ планирования таймеров и селекторов. – hamstergene