如何启用对选定文件和文件夹进行操作的服务

时间:2013-12-09 00:57:00

标签: objective-c macos

我正在尝试启用在选定Files and Folders上运行的服务,这些服务类似于可以在Finder中调用的服务。

我基于Services Implementation Guide有以下内容,但仅适用于Text等

+ (void)initialize {
    static BOOL initialized = NO;
    /* Make sure code only gets executed once. */
    if (initialized == YES) return;
    initialized = YES;

    NSArray *sendTypes = [NSArray arrayWithObject:NSStringPboardType];
    [NSApp registerServicesMenuSendTypes:sendTypes returnTypes:nil];
    NSLog(@"initialize MyTableView");
}
- (id)validRequestorForSendType:(NSString *)sendType returnType:(NSString *)returnType {
    NSLog(@"validRequestorForSendType %@%@", sendType, returnType);
    if ([sendType isEqual:NSStringPboardType]) {
            return self;
    }
    return [super validRequestorForSendType:sendType returnType:returnType];
}

如何实施网址?

文档说明

  

您的NSResponder对象可以注册任何粘贴板数据类型public   或专有的,普通的或罕见的。如果它处理公众和共同   类型,当然,它可以访问更多的服务。有关的列表   标准粘贴板数据类型,请参阅NSPasteboard类参考。

似乎没有相应的粘贴板数据类型。我试过NSURLNSURL class NSFilenamesPboardType部分有效,但没有显示所有服务查找器,并且似乎属于(OS X v10.5及更早版本)

编辑说明

我一直在关注Services Implementation Guide,这似乎有3个步骤

1.注册服务对象

NSApp registerServicesMenuSendTypes: returnTypes:

2.验证服务菜单项

validRequestorForSendType:returnType:

3.向服务发送数据

writeSelectionToPasteboard:types:

我有前两个部分工作(虽然我不能得到我在Finder中看到的相同的菜单,特别是Files and Folders时选择了文件)

第三点似乎是关键点 这似乎支持NSTextView,但已弃用NSObject

我真的在寻找一些如何使用Files and Folders服务的方法,就像许多其他应用程序一样。

Desired Services Menu

1 个答案:

答案 0 :(得分:1)

我已经完成了这项工作,并且发布的结果是为了其他可能想要做类似事情的人的利益。

前3个方法在我的Class中,它包含了一个View

+ (void)initialize {
    static BOOL initialized = NO;
    /* Make sure code only gets executed once. */
    if (initialized == YES) return;
    initialized = YES;

    [NSApp registerServicesMenuSendTypes:[NSArray arrayWithObject:(__bridge NSString *)kUTTypeFileURL] returnTypes:nil];
}
- (id)validRequestorForSendType:(NSString *)sendType returnType:(NSString *)returnType {
    if ([sendType isEqual:(__bridge NSString *)kUTTypeFileURL]) {
            return self;
    }
    return [super validRequestorForSendType:sendType returnType:returnType];
}
- (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard types:(NSArray *)types {
    if([self.keyDelegate respondsToSelector:@selector(writeSelectionToPasteboard:types:)])
        return [self.keyDelegate writeSelectionToPasteboard:pboard types:types];
    return FALSE;
}

代表中实际写入粘贴板的最后一个。

- (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard types:(NSArray *)types {
    return [pboard setString:[[[self selectedFile] url] absoluteString] forType:(__bridge NSString *)kUTTypeFileURL];
}

有一定数量的猜测/实验,因为似乎没有明确规定要求。 这是一个简单的实现,因为我只对一种类型感兴趣。