从 xcode 创建一个“命令行工具”项目,然后设置并运行 NSApplication。此应用程序中的光标无法更改
Posted
技术标签:
【中文标题】从 xcode 创建一个“命令行工具”项目,然后设置并运行 NSApplication。此应用程序中的光标无法更改【英文标题】:Create a "Command Line Tool" project from xcode, and setup and run NSApplication. The cursor in this application can't change 【发布时间】:2020-03-18 03:52:27 【问题描述】:我制作了一个基于“命令行工具”项目的小工具。 除此工具中的光标外,一切正常。
这是启动代码:
int main(int argc, const char * argv[])
NSApplication * app = [NSApplication sharedApplication];
MyDelegate * delegate = [[MyDelegate alloc] init];
app.delegate = delegate;
[app run];
return 0;
在 MyDelegate 中,我创建了窗口、视图等。但是我覆盖了视图中的 resetCursorRects
函数,但什么也没发生。
如果在应用程序项目中运行相同的代码,一切都会好起来的。
我尝试过的所有内容包括:
从 NSApplication 创建一个子类并重写 run 函数来处理 uesr 事件。 在视图中创建一个 NSTrackingArea 来更新光标。 在 mainThread 上执行 selector(run) 并等待直到完成。
但是它们根本不起作用。
现在我猜的所有原因是函数NSApplicationMain(argc, argv)
不等于[app run]
。
有什么区别?谁能帮帮我?
PS:如果我使用NSApplicationMain(argc, argv)
,xcode 会给我一个错误,我必须有一个 bundle 和 Info.plist。我不想创建应用程序,因为它太胖了。
【问题讨论】:
【参考方案1】:默认情况下,不是捆绑应用程序的程序是仅后台进程。默认情况下,捆绑的应用程序是具有前台功能的进程。 (可以在应用的 Info.plist 中设置 LSUIElement
键来更改它。)
只有激活的应用可以设置光标。仅后台或 UI 元素(也称为附件)进程不能成为活动应用。
如果您希望您的程序能够被激活并控制光标,您可以使用[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]
使其成为具有前台功能的应用程序进程。请注意,这将使它出现在 Dock 和 Command-Tab 应用程序切换器中(但带有通用可执行图标)。
当然,让您的程序成为一个成熟的捆绑应用程序更加容易和简单。
【讨论】:
哇,太棒了。而我真正需要的策略是 NSApplicationActivationPolicyAccessory。非常感谢:D。以上是关于从 xcode 创建一个“命令行工具”项目,然后设置并运行 NSApplication。此应用程序中的光标无法更改的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 命令行工具 (XCode 4.6) 从终端运行单元测试
Xcode GM:OS X 命令行工具项目没有 swift 语言?
如何在 Xcode 4.5“命令行工具”项目中设置工作逻辑单元测试目标?