与大多数其他OS X应用程序相比,我应该传递给-[NSApp activateIgnoringOtherApps:]以使我的应用程序启动"naturally"?



当我学习如何自己启动nsapplication时,我使用的代码(基于这里和这里)

[NSApp activateIgnoringOtherApps:YES];

强制应用程序在启动时排在前面。

我想知道大多数其他应用程序是怎么做的。我希望能够直接从二进制文件和应用程序包中运行程序,我不使用Xcode来构建这个(原始构建)。所以,可以说,我宁愿这件事顺其自然。

文档确实说Finder问题NO,但是…为什么仪?这不是一个从进程内部运行的方法,而不是外部吗?(我无法控制这个选择。)那码头和其他可能的入口呢?

我甚至反汇编了10.8的NSApplicationMain(),看看它做了什么,但据我所知,32位版本,除非这个"轻启动"的东西发出这个选择器,这个选择器永远不会被调用。

这个问题有答案吗?谢谢……如果这让你困惑了,很抱歉;我尽量把话说清楚。

应用程序通常不调用-activateIgnoringOtherApps:。一般来说,不应该。当然,它不会在NSApplicationMain(),这是太早,相当远的实际应用程序启动相关。

应用程序通常通过启动服务启动(Finder、Dock和/usr/bin/open以及任何其他可能打开你的应用程序或你处理的文档的应用程序都使用该服务)。大致的情况是,启动服务停用了调用它来打开其他东西的应用程序,然后,在启动的应用程序中,Cocoa的内部做了类似(但不一定相同)[NSApp activateIgnoringOtherApps:NO]的事情。通过这种方式,只有在这两个事件之间没有其他事件被激活时,启动的应用程序才会被激活。如果间隔很长(因为某些东西很慢),并且用户在此期间切换到其他东西,你不希望从他们切换到的东西上窃取焦点。

你应该只调用[NSApp activateIgnoringOtherApps:YES]响应用户请求激活你的应用程序在上下文中,不包括启动服务自动停用当前应用程序。例如,如果您有一个命令行程序,它将自己转换为GUI应用程序(使用-[NSApplication setActivationPolicy:]或已弃用的TransformProcessType()),那么运行该工具的用户意味着他们希望它处于激活状态。但是Terminal是活动的,不会因为运行了您的程序而自动停用。所以,程序来抢焦点。

如果你的程序是一个捆绑的应用程序,那么从命令行运行它应该用/usr/bin/open来完成,而不是直接在捆绑包内执行可执行文件。然后,您根本不需要调用-activateIgnoringOtherApps:,传递什么值的问题是没有意义的。

最新更新