2014-12-03 32 views
1

我正在嘗試構建一個獨立的系統服務(應用程序擴展名爲.service,保存到〜/ Library/Services /)以替換用戶在Mac OS X中選擇的文本。使用Xcode替換文本服務 - 不替換選定的文本

我想用Xcode和而不是 Automator,因爲我比Applescript更習慣於Objective-C。

我在網上找到了幾個例子,例如: thisApple'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; 
} 
+1

任何人......? Bueller? – 2014-12-04 07:38:16

回答

3

後的Apple's documentation仔細閱讀,我找到了答案:我的服務應用程序的plist文件缺失下的服務部的鍵:

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

我只有相反的NSSendTypes鍵,它允許您將數據從客戶端應用程序發送到服務。這一個是需要發送修改後的文本(在另一個方向)。

這很奇怪,因爲蘋果的文檔似乎暗示自10.6(Snow Leopard)開始,指定這兩個不再是必需的。

+0

像往常一樣,我會等幾天才能接受我自己的答案,以防有人提供有關此主題的有用信息。 – 2014-12-10 09:22:49

1

對於(希望)有用控制檯噴出,在終端類型:

defaults write -g ViewBridgeLogging -bool YES

注:對服務和擴展也是有用的。

+0

謝謝你的提示。 – 2014-12-16 00:06:15