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”菜单下)。您所说的查找器菜单是什么?另请看此答案我在创建服务时没有问题。我想向应用程序添加一个类似于上面编辑的图像的服务菜单