6

フォルダーのドロップを受け入れる必要があるカスタム ビューを作成しています。条件は、ディレクトリのみが受け入れられるため、ユーザーがファイルをドラッグしても何も起こらないことです。

ビューを次のように登録しました。

[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];

また、基本的なドラッグ プロトコル メソッドは既に実装されています。テスト目的:

- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
{
    NSLog("@Drag Entered");
    return NSDragOperationCopy;
}

- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender
{
    return NSDragOperationCopy;
}

- (void)draggingExited:(id<NSDraggingInfo>)sender
{
    NSLog(@"Dragging Exited");
}

- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender { return YES; }
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender    { return YES; }

したがって、ほぼ正しく動作します。ビュー上をドラッグすると、カーソルにプラス記号が表示されます。ただし、アイテムが通常のファイルの場合は避けたいと思います。

ドラッグしたパスを取得したら、おそらく NSFileManager でそれを行う必要がありますが (もっと簡単な方法があるのではないかと思います)、問題はどこにあるかです。NSDragOperationNonedraggingEntered:を返すメソッドにテストを含めようとしましたが、成功しませんでした。私はAppleのドキュメントのスニペットに従っています:

{
    NSPasteboard *pboard = [sender draggingPasteboard];

    if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
        NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
        int numberOfFiles = [files count];
        // Perform operation using the list of files
    }
    return YES;
}

このテストをどこに実装すればよいのでしょうか?ファイルがドラッグされてもカーソルは同じままになりますか?

4

1 に答える 1

6

テストを実装して、ペーストボードにファイルが含まれているかどうか-draggingEntered:を返す必要があります。NSDragOperationNone

ただし、 も実装している‑draggingUpdated:ため、そのメソッドにもフォルダー タイプのテストを追加する必要があります。

現時点では、常にファイル タイプをテストせずに戻ってきます。NSDragOperationCopyつまり‑draggingUpdated:、マウスがドラッグ先の内側に移動するとすぐに、 で何をしてもカーソルがコピー カーソルに変わります‑draggingEntered:

実装‑draggingUpdated:はオプションであることに注意してください。複数のドラッグ先が考えられる複雑なビューを実装していない場合は、それを実装する必要はありませ‑draggingEntered:‑draggingExited:

于 2011-06-02T02:15:48.417 に答える