gpt4 book ai didi

objective-c - 可以拖放文件 URL 文本,但不能拖放实际文件

转载 作者:行者123 更新时间:2023-12-03 17:31:56 25 4
gpt4 key购买 nike

我可以从 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];

}

最佳答案

如果你想强制绿色“+”复制,只需在操作掩码中使用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 会神奇地以多种形式复制。话虽如此,您原来的 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 来读取文件的方法(我尝试过这个并且它有效,例如我可以将 TableView 行拖动到富文本中)在 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: 不起作用,但上面的方法确实有效,而且基本上是一样的。)

关于objective-c - 可以拖放文件 URL 文本,但不能拖放实际文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11484580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com