哪里可以获得NSTextView拖动图像参考

时间:2014-12-07 16:04:05

标签: cocoa nstextview

我有一个带有setImportGraphics(true)的NSTextView,我可以在那里拖动图像,它们会显示在界面中,但我不知道如何在拖动图像后以编程方式获取图像(并存储它)

如果我拨打myNSTextView.string,我得到的只是图片周围的文字,但图片似乎不存在。

我是否必须实施一些关于拖放的方法来管理这种情况?

1 个答案:

答案 0 :(得分:1)

  

我不知道如何在拖动图像后以编程方式获取图像(并存储它)。

丢弃的图像作为NSTextAttachment添加到NSTextStorage。因此,为了访问已删除的图像,您应该遍历textStorage的内容并检查符合图像文件的附件。

  

我是否必须实施一些有关拖放的方法来管理此案例

您当然可以通过扩展NSTextView并覆盖- (void)performDragOperation:(id<NSDraggingOperation>)sender方法来处理已删除的文件,如果您想这样做,我建议您阅读Apple的Drag and Drop Programming Topics文档。

由于我不是子类的粉丝,我对这个问题的回答使用了一个NSAttributedString类来返回附加图像的NSArray。可以使用以下代码解决:

#import "NSAttributedString+AttachedImages.h"

@implementation NSAttributedString (AttachedImages)


- (NSArray *)images
{
    NSMutableArray *images = [NSMutableArray array];
    NSRange effectiveRange = NSMakeRange(0, 0);

    NSTextAttachment *attachment;
    CFStringRef extension;
    CFStringRef fileUTI;

    while (NSMaxRange(effectiveRange) < self.length) {
        attachment = [self attribute:NSAttachmentAttributeName atIndex:NSMaxRange(effectiveRange) effectiveRange:&effectiveRange];

        if (attachment) {
            extension = (__bridge CFStringRef) attachment.fileWrapper.preferredFilename.pathExtension;
            fileUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, extension, NULL);
            if (UTTypeConformsTo(fileUTI, kUTTypeImage)) {
                NSImage *theImage = [[NSImage alloc] initWithData:attachment.fileWrapper.regularFileContents];
                [theImage setName:attachment.fileWrapper.preferredFilename];

                [images addObject:theImage];
            }
        }
    }

    return images.copy;
}

@end

如果您使用GIT,则可以从我的Github repository克隆代码。

我希望它有所帮助