0

NSTableView セルからファイル URL をドラッグして、任意のテキスト エディターにドロップできます。ただし、Apple のドキュメントに関する私の理解によれば、URL をドロップすると、ファイルはドロップした場所にコピーされるはずです。

- (BOOL)tableView:(NSTableView *)tv writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard*)pboard {

    //for now putting specific file path in just to get it working
    NSString *filePath = @"/Users/Jackh/Desktop/Apple.png";
    [pboard declareTypes:[NSArray arrayWithObject:NSURLPboardType] owner:self];
    [[NSURL URLWithString:filePath] writeToPasteboard:pboard];

    return YES;

}

filePath からドロップされた場所にファイルをコピーするにはどうすればよいですか? 今のところ、filePath をテキストとして移動しているだけです。

何か案は?

編集:私は今このコードを使用しています

-(void)awakeFromNib {

    [self.tableView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:NO];

}

...

[self.tableView registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, NSFileContentsPboardType, nil]];

...

- (BOOL)tableView:(NSTableView *)tv writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard*)pboard {

    //for now putting specific file path in just to get it working
    NSString *filePath = @"/Users/Jackh/Desktop/Apple.png";
    [pboard declareTypes:[NSArray arrayWithObject:NSFileContentsPboardType] owner:nil];
    [pboard writeFileContents:filePath];

}
4

1 に答える 1

4

緑色の「+」を強制的にコピーしたい場合NSDragOperationCopyは、操作マスクで (のみ) を使用し、他の操作を禁止します。例awakeFromNib

[self.tableView setDraggingSourceOperationMask:NSDragOperationCopy forLocal:NO];

あなたの例をFinderで動作させるために私が見つけることができる最良の方法は次のとおりです。

- (BOOL)
tableView:(NSTableView *)tv
writeRowsWithIndexes:(NSIndexSet*)rowIndexes
toPasteboard:(NSPasteboard*)pboard {
    NSString *filePath = @"/Users/kevin/Desktop/1.png";
    [pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType]
                         owner:nil];
    [pboard setPropertyList:[NSArray arrayWithObject:filePath]
                            forType:NSFilenamesPboardType];
    return YES;
}

Apple はより最新の API を使用することを推奨していますが、このような場合には大きな副作用があることに注意してください。URL が魔法のように複数の形式でコピーされるため、ファイルが2 回コピーされるようです。そうは言っても、元の URL の例は機能しませんでした。writeObjects:これは、URL をwriteToPasteboard:. URL の例:

- (BOOL)
tableView:(NSTableView *)tv
writeRowsWithIndexes:(NSIndexSet*)rowIndexes
toPasteboard:(NSPasteboard*)pboard {
    NSString *filePath = @"/Users/kevin/Desktop/1.png";
    [pboard declareTypes:[NSArray arrayWithObject:NSURLPboardType]
                         owner:nil];
    [pboard writeObjects:[NSArray arrayWithObject:
                          [NSURL fileURLWithPath:filePath]]];
    return YES;
}

他のコメントで指摘したように、ドラッグの対象がFinder などのファイル マネージャーではなくドキュメントである場合は、ファイルの実際のデータを含めることをお勧めします。ドキュメントが生データを誤って解釈することはありません (つまり、ドキュメントはデータを直接挿入する必要があり、代わりにパス文字列を挿入することはできません)。一方、生データのドラッグは、何らかの理由で Finder にファイルを作成しないため、主に代替としてペーストボードに追加するものとして役立ちます。

ここでは、UTI を使用してファイル タイプを宣言し、ファイルを読み取るために呼び出す方法を示しNSDataます (これを試してみたところ、うまくいきました。たとえば、テーブル ビューの行を TextEdit のリッチ テキスト ドキュメントにドラッグして、ウィンドウに挿入された画像を確認できます)。 ):

- (BOOL)
tableView:(NSTableView *)tv
writeRowsWithIndexes:(NSIndexSet*)rowIndexes
toPasteboard:(NSPasteboard*)pboard {
    NSString *filePath = @"/Users/kevin/Desktop/1.png";
    [pboard declareTypes:[NSArray arrayWithObject:@"public.png"]
                         owner:nil];
    [pboard setData:[NSData dataWithContentsOfFile:filePath]
                    forType:@"public.png"];
    return YES;
}

(なぜ機能しないのか正確にはわかりwriteFileContents:ませんが、上記は機能し、基本的に同じことです。)

于 2012-07-15T02:43:15.920 に答える