Не удается заставить NSAlert постоянно отображать значок дока

У меня, похоже, проблема прямо противоположная этому вопросу о прекращении отскока док-станции.

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

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

Вот мой код, который я поместил в метод делегирования приложения applicationWillFinishLaunching:.

if (!AXAPIEnabled()) {        // I'm checking that Accessibility is turned on

    NSAlert *alert = [[NSAlert alloc] init];
    [alert setAlertStyle:NSCriticalAlertStyle];
    [alert setMessageText:@"Lapsus cannot run."];
    [alert addButtonWithTitle:@"Open Accessibility Prefs..."];
    [alert addButtonWithTitle:@"Quit"];
    [alert setInformativeText:@"Lapsus needs \"Enable access for assistive devices\" in the Accessibility pane of System Preferences to be turned on."];

    [NSApp activateIgnoringOtherApps:YES];
    int attentionrequest = [NSApp requestUserAttention:NSCriticalRequest];

    NSInteger returnValue = [alert runModal];
    ....
    [NSApp cancelUserAttentionRequest:attentionrequest];
}

Я попытался удалить строку requestUserAttention.

Я пробовал размещать строку requestUserAttention во многих разных местах: непосредственно перед вызовом runModal, первым делом и т. д.

Я попытался удалить строку activIgnoringOtherApps.

Что бы я ни делал, значок дока подпрыгивает один раз, а затем останавливается.

Пользователь, вероятно, увидит, что мое приложение выведено на передний план, но есть вероятность, что если они щелкнут в нужное время, их активное приложение скроет сообщение о критической ошибке.

Поэтому я хочу что-то, чтобы даже когда их док спрятан, они знали, что что-то не так.

Я строю это на Mac OS X 10.5 Leopard. Любые идеи о том, что я делаю неправильно? Или Leopard больше не поддерживает постоянно подпрыгивающие значки дока?

ОБНОВЛЕНИЕ:

Я помещал вызов метода в applicationWillFinishLaunching:

Как только я поместил его в applicationDidFinishLaunching: и удалил вызовactivIgnoringOtherApps:, он заработал как надо.

Тем не менее, мой вопрос по-прежнему звучит так: «Могу ли я вывести свое приложение на передний план, а также отобразить значок в доке? Судя по первому ответу, кажется, что нет, хотя я не уверен, что понимаю, почему.

ОБНОВЛЕНИЕ:

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

Заключение

Если вы хотите привлечь внимание пользователей, не используйте [NSAppactivateIgnoringOtherApps:YES];


person John Gallagher    schedule 16.10.2009    source источник
comment
Подумайте об этом: приложение отбрасывает свою иконку, чтобы сообщить пользователю, что по какой-то причине оно хочет стать самым передним. После того, как он получает статус самого переднего, Dock предполагает, что вы получили то, что хотели, и перестает отображать значок. Также подумайте о том, что бы вы сделали с приложением, которое произвольно выводило себя и все свои окна на передний план, пока вы печатали, рисовали или делали что угодно. Если ваши предупреждения не носят действительно опасный для жизни характер, не будьте придурком и не отвлекайтесь.   -  person Azeem.Butt    schedule 17.10.2009
comment
Конечно. Это имеет смысл, когда я, э... думаю об этом. Как я явно не сделал. :) Я не рассматривал то, что я делал, как кражу фокуса, но когда вы так выразились, я вижу, что это неприемлемо. activIgnoringOtherApps:YES с этого момента будет удален из моего набора инструментов! Спасибо за ваш комментарий.   -  person John Gallagher    schedule 17.10.2009


Ответы (1)


Если вы отправляете activIgnoringOtherApps, то вы фактически отклоняете свое собственное уведомление.

person Azeem.Butt    schedule 16.10.2009
comment
В ПОРЯДКЕ. Таким образом, это выбор между выводом вашего приложения на передний план и отображением значка в доке. Я не могу иметь оба. Это правильно? - person John Gallagher; 16.10.2009
comment
Вывод приложения на передний план должен включать в себя первого ответчика. Я изучаю iPhone, но я думаю, что это похоже. - person JoePasq; 16.10.2009