11

他のアプリから選択をコピーする必要がある顔のない Mac OS X アプリがあります。CMD+C キーストロークをシミュレートすることでこれを実現します。それは完全に機能します。しかし、重大な副作用があると思います。ユーザーの許可なく、ユーザーのペーストボードを上書きします。そのため、選択範囲をコピーする前に、ペーストボードのコンテンツを保存してから復元する必要があると考えていました。誰かがヒント、サンプルコードを教えてもらえますか?

4

3 に答える 3

8

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
于 2011-09-02T19:33:53.467 に答える
2

オブジェクトの関連付けを使用した代替の自己完結型の実装:

#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
于 2013-04-24T14:24:45.063 に答える
1

を見てくださいNSPasteboard

+[NSPasteboard generalPasteboard]共有ペーストボードが提供され、そのクラスを使用してコンテンツを取得および設定できます。

于 2011-05-25T03:06:55.450 に答える