cocoaでのファイルのドロップ受付処理の実装

Pocket

ドロップを受け付けるためには、対象となるViewを継承して拡張する必要があります。 

ここでは、需要が多そうなNSCollectionViewを拡張した場合を例として説明します。

ヘッダ宣言。ドロップ後の処理を委譲するためにProtocolを定義します。

#import <Cocoa/Cocoa.h>

@protocol MyCollectionViewDelegate <NSObject>

-(void)myCollectioinViewDroppedFiles:(NSArray*)files;

@end

 

@interface MyCollectionView : NSCollectionView

@property(nonatomicassignid<MyCollectionViewDelegate> dropDelegate;

@end

 

実装はこう

#import “MyCollectionView.h”

 

@implementation MyCollectionView

 

-(void)awakeFromNib

{

    NSLog(@”%s”__FUNCTION__);

    

    //allow drag and drop for finder

    [self registerForDraggedTypes:@[NSFilenamesPboardType]];

}

 registerForDraggedTypeにてクリップボードからのファイル通知を受け入れる宣言を行います。

 

-(BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender

{

    return YES;

}

 

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

{

    returnNSDragOperationCopy;

}

 

-(NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender

{

    returnNSDragOperationCopy;

}

 

-(BOOL)performDragOperation:(id<NSDraggingInfo>)sender

{

    NSLog(@”%s”__FUNCTION__);

    return YES;

}

 

-(void)concludeDragOperation:(id<NSDraggingInfo>)sender

{

    NSLog(@”%s”__FUNCTION__);

    NSArray* files = [self filelistInDraggingInfo:sender];

    [self.dropDelegate myCollectioinViewDroppedFiles:files];

}

 

-(NSArray*)filelistInDraggingInfo:(id<NSDraggingInfo>)info

{

    NSPasteboard* board = [info draggingPasteboard];

    NSArray* files = [board propertyListForType:NSFilenamesPboardType];

    return files;

}

prepareForDragOperationにて受け入れを許可する宣言。
draggingEntered、draggingUpdatedにて、ドラッグ中のマウスカーソルをコピー用のものに指定しています。
concludeDragOperationにて、最終的にドロップされたファイル群を受け取りdelegate先に通知して、このクラスでの処理は終了します。
NSArrayの中は、ファイルのフルパスを記述したNSStringになっています。どうしてNSURLじゃないんでしょうね。

後は継承したViewをInterface Builderで割り当てるなりコード上で生成するなりで完成となります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です