Objective c 如何启用在选定文件和文件夹上运行的服务

Objective c 如何启用在选定文件和文件夹上运行的服务,objective-c,macos,Objective C,Macos,我正在尝试启用在选定的文件和文件夹上运行的服务,类似于可以在Finder中调用的服务 以下内容基于《服务实施指南》,该指南有效,但仅适用于文本等 + (void)initialize { static BOOL initialized = NO; /* Make sure code only gets executed once. */ if (initialized == YES) return; initialized = YES; NSArray

我正在尝试启用在选定的
文件和文件夹上运行的服务,类似于可以在Finder中调用的服务

以下内容基于《服务实施指南》
,该指南有效,但仅适用于文本等

+ (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];
}
如何实现URL

文件说明

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

似乎没有相应的粘贴板数据类型。我试过
NSURL
NSURL类
NSFilenamesPboardType
部分工作,但不显示Finder提供的所有服务,并且似乎属于(OS X v10.5及更早版本)

编辑澄清

我一直在遵循《服务实施指南》,该指南似乎有3个步骤

1.为服务注册对象

NSApp registerServicesMenuSendTypes: returnTypes:
2.验证服务菜单项

validRequestorForSendType:returnType:
3.向服务发送数据

writeSelectionToPasteboard:types:
我已经得到了前2个部分工作(虽然我无法获得与在Finder中看到的相同的菜单,当选择一个文件时,尤其是
文件和文件夹

第三个似乎是症结所在 这似乎在
NSTextView
中受支持,但在
NSObject

我真的想知道如何像许多其他应用程序一样使用
文件和文件夹的服务


我已经完成了这项工作,我发布这项结果是为了其他可能想做类似工作的人

前3个方法在我的类中,它是视图的子类

+ (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];
}
由于需求似乎没有明确规定,因此存在一定数量的猜测/实验。
这是一个简单的实现,因为我只对一种类型感兴趣。

我已经完成了这项工作,并且正在发布结果,以便其他可能想做类似工作的人受益

前3个方法在我的类中,它是视图的子类

+ (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];
}
由于需求似乎没有明确规定,因此存在一定数量的猜测/实验。
这是一个简单的实现,因为我只对一种类型感兴趣。

这个问题让我很困惑。您是否希望显示应用程序菜单中显示的相同“服务”菜单(例如,运行TextEdit时显示在“TextEdit”菜单下;运行Safari时显示在“Safari”菜单下)。您所说的查找器菜单是什么?另请看此答案我在创建服务时没有问题。我想在应用程序中添加一个类似于上面编辑的图像的服务菜单。这个问题让我很困惑。您是否希望显示应用程序菜单中显示的相同“服务”菜单(例如,运行TextEdit时显示在“TextEdit”菜单下;运行Safari时显示在“Safari”菜单下)。您所说的查找器菜单是什么?另请看此答案我在创建服务时没有问题。我想向应用程序添加一个类似于上面编辑的图像的服务菜单