【发布时间】:2009-10-16 15:56:42
【问题描述】:
我似乎遇到了与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: 调用后,它就按要求工作了。
但是,我的问题仍然是“我可以将我的应用程序放在前面以及弹跳停靠图标吗?从第一个答案来看,似乎不是,尽管我不确定我是否明白为什么。
更新:
我不明白为什么,因为我没有仔细考虑。既然有人向我指出,偷取焦点意味着扩展坞得到了它想要的东西,这完全有道理。
结论
如果您希望用户注意,请不要使用 [NSApp activateIgnoringOtherApps:YES];
【问题讨论】:
-
想一想:一个应用程序反弹它的图标是为了告诉用户它出于某种原因想要成为最前面的。在它获得最前面的状态后,Dock 会假设你得到了你想要的并停止弹跳你的图标。还想一想当你在打字、绘图或做几乎任何事情的过程中,你会如何处理一个任意将自身及其所有窗口置于最前面的应用程序。除非您的警报确实具有威胁生命的性质,否则不要做一个混蛋并窃取焦点。
-
当然。当我,呃……想一想时,这完全有道理。因为我显然没有。 :) 我不认为我在做什么是“窃取焦点”,但是当你这样说时,我可以看到这是不可接受的。从现在开始,activateIgnoringOtherApps:YES 将从我的工具箱中消失!感谢您的评论。
标签: objective-c cocoa alerts nsalert