LSUIElement ведет себя несовместимо с activIgnoringOtherApps - PullRequest
7 голосов
/ 07 декабря 2009

В частности, он ведет себя непоследовательно в отношении фокуса текстового поля.

У меня есть LSUIElement, выскакивающий меню состояния.В этом меню есть представление, содержащее текстовое поле.Текстовое поле должно быть доступно для выбора - не обязательно выбрано по умолчанию, но в зависимости от того, что произойдет.

При нажатии на элемент состояния запускается

[NSApp activateIgnoringOtherApps:YES];

И это работает, примерно в два раза. * Другая половина меню состояния, кажется, считает себя "на заднем плане" и не позволяет мне сосредоточиться на текстовом поле, даже нажав на него.(Я знаю, что срабатывает щелчок триггера элемента состояния, потому что на нем есть NSLog.)

Это ошибка в том, как Apple обрабатывает эти элементы статуса, или я неправильно обращаюсь с activIgnoringOtherApps?

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

Полный фрагмент:

-(void)statusItemClicked:(id)sender {
    //show the popup menu associated with the status item.
    [statusItem popUpStatusItemMenu:statusMenu];

    //activate *after* showing the popup menu to obtain focus for the text field.
    [NSApp activateIgnoringOtherApps:YES];

}

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Наконец-то нашли обходной путь для этого.

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

-(void)pop:(NSTimer *)timer {
    [statusItem popUpStatusItemMenu:theMenu];
}

-(void)statusItemClicked:sender {
    [NSApp activateIgnoringOtherApps:YES];
    [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(pop:) userInfo:nil repeats:NO];
}

pop: вызывается в следующем кадре, поэтому задержка незаметна, но достаточно велика для того, чтобы activateIgnoringOtherApps: делал все, что мешало ей работать должным образом при отображении меню в том же кадре.

0 голосов
/ 07 декабря 2009

По опыту я знаю, что вам нужно позвонить activateIgnoringOtherApps: после того, как вы открыли меню, содержащее текстовое поле. Так что вам нужно будет сделать это в следующем порядке:

- (void)statusItemClicked:sender {
    [statusItem popUpStatusItemMenu:theMenu];
    [NSApp activateIgnoringOtherApps:YES]; // FYI, NSApp is shorthand for [NSApplication sharedApplication]
}

Судя по тому, что вы сказали, ваше приложение активируется слишком поздно, поэтому оно не активируется при первом нажатии на элемент, но уже активируется при последующих щелчках.

...