我编写了一个可以作为服务调用的应用程序(通过右键单击 Finder 中的文件并选择使用我的应用程序打开它),但是这样做会产生一些不需要的副作用。
服务目标方法示例:
- (void)doSomething:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error {
NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
NSLog(@"Selected file(s): %@", files);
[self.anotherWindow makeKeyAndOrderFront:self];
}
1)当应用程序以这种方式启动时(即使已经在调试模式下打开),我似乎无法从 doSomething 函数访问其他窗口/控件。例如,上面显示“anotherWindow”的尝试不会产生错误,但不会“做”任何事情。根据堆栈跟踪,当从 -doSomething 检查时,所有 gui 组件的值都为 0x0000000000000000 - 但应用程序已显示并且功能齐全。只有 -doSomething 我无法联系到他们。从 -doSomething 与 -applicationDidFinishLaunching 检查时,“self”也有不同的值。我不确定 -doSomething 如何或为什么使用未初始化的组件获取不同的 self/AppDelegate。似乎由 [NSApp setServicesProvider:self] 修复;
2)我不清楚系统如何决定在调用服务时启动哪个应用程序副本,但它通常不会选择我想要的那个。我在 /Debug 中有一个副本,在 /Release 中有一个副本,在我的桌面上有一个副本......如果我删除一个,它会打开另一个文件(某种回退链?)。如何配置服务(在代码中或通过 .plist)以打开此应用程序的特定版本/位置?但这是一台开发机器。如果我发布一个安装到 /Applications 的可分发文件,我真的需要担心这个吗?