文本用Xcode替换服务 - 不替换所选文本

时间:2014-12-03 05:33:43

标签: objective-c xcode macos cocoa service

我正在尝试构建一个独立的系统服务(带有.service扩展名的应用程序,保存到〜/ Library / Services /)以替换Mac OS X中用户选择的文本。

我想用Xcode和而不是 Automator构建它,因为我比Applescript更习惯于Objective-C。

我在互联网上找到了几个例子,例如: this以及Apple's documentation。我已经适当地配置了Xcode项目并且没有问题地构建。但是,当我安装我的服务并尝试使用它时,没有任何反应。

执行服务方法本身:我放置代码以在其方法体内显示NSAlert并显示。但是,所选文本不会被替换。

知道可能遗漏的是什么吗?这是实现服务的方法:

- (void) fixPath:(NSPasteboard*) pboard
        userData:(NSString*) userData
           error:(NSString**) error
{
    // Make sure the pasteboard contains a string.
    if (![pboard canReadObjectForClasses:@[[NSString class]] options:@{}])
    {
        *error = NSLocalizedString(@"Error: the pasteboard doesn't contain a string.", nil);
        return;
    }

    NSString* pasteboardString = [pboard stringForType:NSPasteboardTypeString];


    //NSAlert* alert = [[NSAlert alloc] init];
    //[alert setMessageText:@"WORKING!"];
    //[alert runModal];

    // ^ This alert is displayed when selecting the service in the context menu


    pasteboardString = @"NEW TEXT";

    NSArray* types = [NSArray arrayWithObject:NSStringPboardType];

    [pboard clearContents];
    [pboard declareTypes:types owner:nil];

    // Set new text:
    [pboard writeObjects:[NSArray arrayWithObject:pasteboardString]];

    // Alternatively:
    [pboard setString:pasteboardString forType:NSStringPboardType];

    // (neither works)

    return;
}

2 个答案:

答案 0 :(得分:3)

仔细阅读Apple's documentation后,我找到了答案:我的服务应用程序的plist文件缺少服务部分下的密钥:

<key>NSReturnTypes</key>
<array>
    <string>NSStringPboardType</string>
</array>

我只有相反的NSSendTypes密钥,它允许您将数据从客户端应用程序发送到服务。需要这一个来发送修改后的文本(在另一个方向)。

这很奇怪,因为Apple的文档似乎暗示自10.6(Snow Leopard)以来不再需要指定这两个。

答案 1 :(得分:1)

对于(希望)有用的控制台喷出,在终端类型中:

defaults write -g ViewBridgeLogging -bool YES

注意:也适用于服务和扩展。