0

Finder からファイル/フォルダーを直接ドラッグ アンド ドロップできる ImageView サブクラスを含むアプリを作成しました。

問題は、iPhoto または Aperture からの写真も受け入れるようにしようとしていることです。

どちらPboardTypeに登録すればよいですか?

私が現在行っているのは次のとおりです。

    [self registerForDraggedTypes:
     [NSArray arrayWithObjects:NSFilenamesPboardType, nil]];

何か案は?

4

2 に答える 2

3

Pasteboard Peeker (Apple 製) を使用すると、Aperture がファイル名/URL と「絞り画像データ」(それが何であれ) を提供することがわかります。iPhoto は、PLIST である「ImageDataListPboardType」のみを提供するように見えます。NSLog() を実行してその構造を確認し、そこから画像情報を引き出すことができると思います。ファイル名/URL 情報と実際の画像がデータとして含まれている可能性があります。

于 2012-11-02T15:38:41.603 に答える
0

NSFilenamesPboardType への登録は正しいです。タスクを完了するには:

1: dragEntered でコピー操作を受け入れるようにしてください。一般的な操作が不十分です。

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {

    NSDragOperation sourceDragMask = [sender draggingSourceOperationMask];
    NSPasteboard *pasteboard = [sender draggingPasteboard];
    if ( [[pasteboard types] containsObject:NSFilenamesPboardType] ) {
            if (sourceDragMask & NSDragOperationCopy) {
                return NSDragOperationCopy;
            }
    }

    return NSDragOperationNone;
}

2: 写真ごとに 1 つのファイル名があります。彼らと何かをしてください。

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
    NSPasteboard *pasteboard;
    NSDragOperation sourceDragMask;

    sourceDragMask = [sender draggingSourceOperationMask];
    pasteboard = [sender draggingPasteboard];

    if ([[pasteboard types] containsObject:NSFilenamesPboardType])
    {    
         NSData* data = [pasteboard dataForType:NSFilenamesPboardType];        
         if(data)
         {
             NSString *errorDescription;
             NSArray *filenames = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:kCFPropertyListImmutable format:nil errorDescription:&errorDescription];

             for (NSString* filename in filenames)
             {
                 NSImage* image = [[NSImage alloc]initWithContentsOfFile:filename];
                 //Do something with the image
             }
         }
     }

    return YES;
}
于 2013-01-17T01:26:33.693 に答える