在自己的应用程序中使用Yosemite上的图像编辑扩展

ilj*_*ing 16 cocoa objective-c osx-yosemite

在我的OS X应用程序中,我想让用户编辑带有安装在他/她的Mac上的相应动作扩展的图像,例如Mail.app或TextEdit中的图像标记扩展(对于带有图像的RTFD文件) - 或Pixelmator的修复工具(如果有).据我所知,Apple在WWDC '14宣布将有一个公共API来完成这项任务.

遗憾的是,我找不到任何关于如何从主机应用程序角度使用扩展的起点,无论是文档还是样本代码.

我发现你必须将NSSharingPicker的未记录的样式属性设置为非零值,如下所示:

- (IBAction)testSharingPicker:(id)sender
{
    NSSharingServicePicker *picker = [[NSSharingServicePicker alloc] initWithItems:@[[self.listing.images.firstObject thumbImage]]];

    [picker setValue:@(1) forKey:@"style"];
    [picker setDelegate:self];

    [picker showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMinYEdge];
}
Run Code Online (Sandbox Code Playgroud)

一旦设置了样式值,您就知道自己处于正确的轨道上,因为- (NSArray *)sharingServicePicker:(NSSharingServicePicker *)sharingServicePicker sharingServicesForItems:(NSArray *)items proposedSharingServices:(NSArray *)proposedServices我的系统上安装了图像编辑扩展,而不是常规的共享扩展.

您还需要实现一个未记录的委托方法:

- (BOOL)sharingServicePicker:(NSSharingServicePicker *)sharingService shouldShowForView:(NSView*) inView
{
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

但是,选择器还没有出现.我得到的只是sender按钮周围的一些奇怪的边框.

Jos*_*osh 5

不幸的是,Apple目前似乎只真正公开了Action Extensions NSTextView

在OS X上,NSTextView在向用户展示扩展程序方面扮演着核心角色。

例如,可以通过创建一个NSTextView并将图像作为插入其中来实现这一点NSFileWrapper(此代码改编自TextEdit):

NSMutableAttributedString *attachments = [[NSMutableAttributedString alloc] init];
NSError *error;
    NSFileWrapper *wrapper = [[NSFileWrapper alloc] initWithURL:[NSURL fileURLWithPath:@"/Users/user/Downloads/Test.png"] options:NSFileWrapperReadingImmediate error:&error];
    if (wrapper) {
        NSTextAttachment *attachment = [[NSTextAttachment alloc] initWithFileWrapper:wrapper];
        [attachments appendAttributedString:[NSAttributedString attributedStringWithAttachment:attachment]];
}

if ([attachments length] > 0) {
    NSRange selectionRange = [self.textView selectedRange];
    if ([self.textView shouldChangeTextInRange:selectionRange replacementString:[attachments string]]) {
        [[self.textView textStorage] replaceCharactersInRange:selectionRange withAttributedString:attachments];
        [self.textView didChangeText];
    }
}
Run Code Online (Sandbox Code Playgroud)

NSTextView显示扩展

(请注意,将图像作为插入NSTextAttachmentCell会导致怪异的崩溃– rdar:// 20333977

您提到的那个怪异的边框似乎是将鼠标悬停在上的图像时显示的共享服务选择器NSTextView,但是按钮略微遮盖了它。

NSButton显示私有NSSharingServicePicker菜单

我偶然发现了您的GitHub存储库,并在此pull请求中提供了我所了解的内容。

通过提出NSSharingServicePicker您的问题中所述,然后保留NSSharingServicein中返回的s,我已经实现了一种变通的解决方法sharingServicePicker:sharingServicesForItems:proposedSharingServices:。然后可以使用调用服务本身,performWithItems:并在中返回数据sharingService:didShareItems:

我的代码在这里