2012-04-25 13 views
10

私は、Finderからドラッグアンドドロップを実装しようとしています。この設定では、コアデータストアへのCocoaバインディングを使用してデータソースとして機能するアレイコントローラであるNSTableViewが使用されます。NSTableViewとFinderからドラッグ&ドロップ

私は基本的に私はSOに見られる様々なブログの記事や他のサイト以下、次のようでした

[[self sourcesTableView] registerForDraggedTypes:[NSArray arrayWithObjects: NSPasteboardTypePNG, nil]]; 

私はNSArrayControllerはをサブクラス化し、以下を追加しました:私は呼んで私のビューコントローラのawakeFromNib

メソッドをサブクラスに追加します(サブクラス化の理由は、アレイコントローラがテーブルビューのデータソースとして機能するので、配列コントローラにドロップの通知が必要であるということです)。

- (BOOL) tableView: (NSTableView *) aTableView acceptDrop: (id <NSDraggingInfo>) info row: (NSInteger) row dropOperation: (NSTableViewDropOperation)operation 

上記の私の実装は、現在ログに書き込むだけで、ブール値YESを返します。

- (NSDragOperation) tableView: (NSTableView *) aTableView validateDrop: (id <NSDraggingInfo>) info proposedRow: (NSInteger) row proposedDropOperation: (NSTableViewDropOperation) operation 

IBでは、私のカスタムNSArrayControllerサブクラスを指す配列コントローラがあります。

結果:何もありません。デスクトップからPNGをテーブルビューにドラッグすると、何も起こりません。そのファイルは元気に元に戻ります。私は間違って何かをしているに違いないが、何を理解していない。どこが間違っていますか?

答えて

17

Finderからのドラッグは、常にファイルドラッグであり、イメージドラッグではありません。 FinderからのURLのドラッグをサポートする必要があります。

[[self sourcesTableView] registerForDraggedTypes:[NSArray arrayWithObject:(NSString*)kUTTypeFileURL]]; 

あなたがそうのようなファイルを検証することができます:

- (NSDragOperation)tableView:(NSTableView *)aTableView validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)operation 
{ 
    //get the file URLs from the pasteboard 
    NSPasteboard* pb = info.draggingPasteboard; 

    //list the file type UTIs we want to accept 
    NSArray* acceptedTypes = [NSArray arrayWithObject:(NSString*)kUTTypeImage]; 

    NSArray* urls = [pb readObjectsForClasses:[NSArray arrayWithObject:[NSURL class]] 
    options:[NSDictionary dictionaryWithObjectsAndKeys: 
       [NSNumber numberWithBool:YES],NSPasteboardURLReadingFileURLsOnlyKey, 
       acceptedTypes, NSPasteboardURLReadingContentsConformToTypesKey, 
       nil]]; 

    //only allow drag if there is exactly one file 
    if(urls.count != 1) 
     return NSDragOperationNone; 

    return NSDragOperationCopy; 
} 

あなたは再度URLを抽出する必要があります、あなたはURLのタイプをしたいことを宣言する必要があることを行うには

tableView:acceptDrop:row:dropOperation:メソッドが呼び出されると、URLからイメージを作成し、そのイメージで何かを実行します。

Cocoaバインディングを使用していても、ドラッグ方法を使用する場合は、NSTableViewdatasourceというオブジェクトを割り当てて実装する必要があります。データソースメソッドがNSTableViewに実装されていないため、NSTableViewをサブクラス化すると問題ありません。

データソースオブジェクトにドラッグ関連のメソッドを実装するだけで、バインディングを使用してテーブルデータを提供するメソッドは実装できません。アレイコントローラに、insertObject:atArrangedObjectIndex:のようなNSArrayControllerメソッドの1つを呼び出すか、またはKey-Value Coding準拠アクセサメソッドを使用してバッキングアレイを変更することによって、ドロップ結果をアレイコントローラに通知する必要があります。

+0

ありがとうございますが、テーブルビューは引き続きドラッグ/ドロップを受け入れません。私がFinderからドラッグするファイルは、バウンスします。私は、データソースにテーブルをアタッチするためにCocoaバインディングを使用します。 – Roger

+0

私は自分の答えを更新しました。それでもデータソースオブジェクトを実装する必要があります。 –

関連する問題