【问题标题】:How do I enable Services which operate on selected Files and Folders如何启用对选定文件和文件夹进行操作的服务
【发布时间】:2013-12-10 15:16:35
【问题描述】:

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

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

+ (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 类参考。

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

编辑说明

我一直在关注Services Implementation Guide,好像有3个步骤

1.注册服务对象

NSApp registerServicesMenuSendTypes: returnTypes:

2.验证服务菜单项

validRequestorForSendType:returnType:

3.向服务发送数据

writeSelectionToPasteboard:types:

我有第一个可以部分工作的(尽管当我尤其选择文件时,我无法在Finder中看到相同的菜单

第三个似乎是症结所在 NSTextView 似乎支持此功能,但 NSObject 已弃用此功能

我真的很想知道如何像许多其他应用程序一样使用 Files and Folders 的服务。

【问题讨论】:

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

标签: objective-c macos


【解决方案1】:

我已经完成了这项工作,并将结果发布给其他可能想要做类似的人。

前 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];
}

由于似乎没有明确规定要求,因此进行了一定程度的猜测/实验。 这是一个简单的实现,因为我只对一种类型感兴趣。

【讨论】:

    猜你喜欢
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多