我正在尝试添加Finder服务,并且在我希望该服务完成其工作之前一切都看起来不错。
这是我的AppDelegate.m中的方法:
-(void)uploadFromPasteboard:(NSPasteboard *)pboard userData:(NSString *)udata error:(NSString **)err
{
NSString *filename = [pboard stringForType:NSURLPboardType];
dbg(@"file: %@", filename);
}
plist配置:
<key>NSServices</key>
<array>
<dict>
<key>NSRequiredContext</key>
<dict/>
<key>NSMenuItem</key>
<dict>
<key>default</key>
<string>Upload File</string>
</dict>
<key>NSMessage</key>
<string>uploadFromPasteboard</string>
<key>NSPortName</key>
<string>Finder</string>
<key>NSSendTypes</key>
<array>
<string>NSURLPboardType</string>
</array>
<key>NSReturnTypes</key>
<array/>
</dict>
</array>
一切似乎都很好,该服务显示在服务菜单中,但是当我单击它时,什么也没有发生,没有日志或其他任何东西,例如根本没有被调用。
有人可以指出我的毛病吗,因为我开始几乎不拔头发:(
最佳答案
您正在设置服务提供商实例吗?像这样(来自:Providing a Service):
EncryptoClass* encryptor = [[EncryptoClass alloc] init];
[NSApp setServicesProvider:encryptor];
仅在应用程序委托类中仅具有此方法是不够的。在标准应用程序设置中,将其包含在您的应用程序委托中可能就足够了:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[NSApp setServicesProvider: self];
}
另外,您还要为
NSPortName
指定“ Finder”。这可能是不正确的。从Services Properties(重点是我):NSPortName是应用程序应在其上端口的名称
监听服务请求。其价值取决于服务的方式
提供者应用程序已注册。在大多数情况下,这是
应用名称。 Automator工作流程将忽略此属性
被用作服务。
我对文档的阅读是,名称在NSPortName中的应用程序是将用于处理服务请求的应用程序。如果您的应用程序名称不是“ Finder”(出于明显的原因,则不应使用“ Finder”),则该服务将永远不会调用您的应用程序。
关于objective-c - NSService不调用其NSMessage,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14728671/