无法让NSAlert不断反弹停靠图标

时间:2009-10-16 15:56:42

标签: objective-c cocoa alerts nsalert

我似乎与this question on stopping dock bounce.

有完全相反的问题

我无法让我的应用程序不断反弹停靠图标!

我也讨厌不断弹跳停靠图标,但在这种情况下,如果用户没有意识到我的应用程序无法启动,他们可能会浪费数小时的时间来跟踪数据。

这是我在应用程序中委托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调用之前,首先是等等。

我已尝试删除activateIgnoringOtherApps行。

无论我做什么,停靠栏图标都会反弹一次然后停止。

用户可能会看到我的应用程序,因为我将它带到前面,但如果他们在正确的时间点击,他们的活动应用程序可能会隐藏重要的错误消息。

所以我想要一些东西,即使他们的码头被隐藏,他们也知道一些不对的东西。

我在Mac OS X 10.5 Leopard上构建它。关于我做错了什么的任何想法?或者Leopard是否不再支持不断弹跳停靠图标了?

更新

我将方法调用放在applicationWillFinishLaunching:

只要我将它放入applicationDidFinishLaunching:中,并删除了activateIgnoringOtherApps:call,它就会按要求运行。

然而,我的问题仍然是“我可以把我的应用程序带到前面以及弹出停靠栏图标吗?从第一个回答看起来似乎没有,虽然我不确定我理解为什么。”

更新

我不明白为什么,因为我没有想到它。现在已经向我指出,窃取焦点意味着码头得到了它想要的东西,它是完全合理的。

结论

如果您希望用户注意,请不要使用[NSApp activateIgnoringOtherApps:YES];

1 个答案:

答案 0 :(得分:2)

如果您发送activateIgnoringOtherApps,那么您基本上会解雇您自己的通知。