我正在尝试添加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/

10-12 14:39