ドロップを受け付けるためには、対象となるViewを継承して拡張する必要があります。
ここでは、需要が多そうなNSCollectionViewを拡張した場合を例として説明します。
ヘッダ宣言。ドロップ後の処理を委譲するためにProtocolを定義します。
#import <Cocoa/Cocoa.h>
@protocol MyCollectionViewDelegate <NSObject>
-(void)myCollectioinViewDroppedFiles:(NSArray*)files;
@end
@interface MyCollectionView : NSCollectionView
@property(nonatomic, assign) id<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で割り当てるなりコード上で生成するなりで完成となります。