Как сначала сохранить содержимое картона, а затем восстановить его? - PullRequest
10 голосов
/ 25 мая 2011

У меня есть безликое приложение Mac OS X, которому нужно скопировать выбор из других приложений. Я достигаю этого, симулируя нажатия клавиш CMD + C. Работает отлично. Но есть, я думаю, что это важно, побочный эффект. Это заменит пользовательский монтажный щит без их разрешения. Поэтому я подумал, прежде чем копировать выделение, я должен сохранить содержимое картона, а затем восстановить его. Может кто-нибудь дать мне подсказку, может быть, пример кода?

Ответы [ 3 ]

8 голосов
/ 02 сентября 2011

Вот категория на NSPasteboard, которую я написал для этого.Кажется, это работает очень хорошо.

@implementation NSPasteboard (SaveAndRestore)

// save current contents as an array of pasteboard items
- (NSArray *)save
{
    NSMutableArray *archive=[NSMutableArray array];
    for (NSPasteboardItem *item in [self pasteboardItems]) 
    {
        NSPasteboardItem *archivedItem=[[NSPasteboardItem alloc] init];
        for (NSString *type in [item types])
        {
            /* The mutableCopy performs a deep copy of the data. This avoids
               memory leak issues (bug in Cocoa?), which you might run into if
               you don't copy the data. */
            NSData *data=[[item dataForType:type] mutableCopy];
            if (data) { // nil safety check
                [archivedItem setData:data forType:type];
            }
        }
        [archive addObject:archivedItem];
    }
    return archive;
}

// restore previously saved data
- (void)restore:(NSArray *)archive
{
    [self clearContents];
    [self writeObjects:archive];
}

@end
1 голос
/ 24 апреля 2013

Альтернативная автономная реализация с использованием ассоциаций объектов:

#import <objc/runtime.h>

static void * kArchiveKey = &kArchiveKey;

@implementation NSPasteboard (SaveRestore)

- (void)setArchive:(NSArray *)newArchive
{
    objc_setAssociatedObject(self, kArchiveKey, newArchive, OBJC_ASSOCIATION_RETAIN);
}

- (NSArray *)archive
{
    return objc_getAssociatedObject(self, kArchiveKey);
}

- (void)save
{
    NSMutableArray *archive = [NSMutableArray array];
    for (NSPasteboardItem *item in [self pasteboardItems]) {
        NSPasteboardItem *archivedItem = [[NSPasteboardItem alloc] init];
        for (NSString *type in [item types]) {
            NSData *data = [item dataForType:type];
            if (data) {
                [archivedItem setData:data forType:type];
            }
        }
        [archive addObject:archivedItem];
    }
    [self setArchive:archive];
}

- (void)restore
{
    [self clearContents];
    [self writeObjects:[self archive]];
}

@end
1 голос
/ 25 мая 2011

Посмотрите на NSPasteboard.

+[NSPasteboard generalPasteboard] даст вам общий монтажный стол, и вы можете использовать этот класс для получения и установки содержимого.

...