gpt4 book ai didi

objective-c - 从 NSTableView 拖放到 Finder 时出现问题

转载 作者:太空狗 更新时间:2023-10-30 03:27:29 28 4
gpt4 key购买 nike

我创建了一个应用程序,它有一个代表一系列文件的 NSTableView。由此,我希望能够将一行(即文件名)从我的 NSTableView 拖到 Finder,并在该文件夹中创建文件。但是,我无法解决的一点是,在将原始文件复制到 Finder 之前,我需要修改它的内容。

我添加了以下行,这样我就可以拖到我的 NSTableView 之外:

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

我可以让它复制实际文件,前提是我将当前文件位置添加到粘贴板,使用:

- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard {
[pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:nil];
NSMutableArray* dragfiles = [[NSMutableArray alloc] init];
NSString* file = [self.files objectAtIndex:row];
NSString* filepath = [[[self.pathControl URL] path] stringByAppendingPathComponent:file];
[dragfiles addObject:filepath];
[pboard setPropertyList:dragfiles forType: NSFilenamesPboardType];
[dragfiles release];
}

但是,因为我想修改文件的内容,所以我不想将文件路径放到粘贴板上。我试过使用 NSFileWrapper,但 Finder 似乎不接受这种有效格式。

我查过谷歌,我发现了一些建议,你可以创建一个临时文件并使用该文件路径。但是,这感觉很难看。

是否可以将数据发送到 Finder?有办法解决吗?

最佳答案

您很可能希望使用 promise 文件,或者 NSFilesPromisePboardType而不是 NSFilenamesPboardType。 (注意:文档中提到的 promise 文件方法 dragPromisedFilesOfTypes:fromRect:source:slideBack:event:namesOfPromisedFilesDroppedAtDestination: 是通用的 NSView方法。NSTableView 定义了您将使用的更方便的方法,而不是通用的方法。也就是说,它仍然应该提供有关 promise 文件拖动如何工作的信息)。 NSTableView 使用 tableView:namesOfPromisedFilesDroppedAtDestination:forDraggedRowsWithIndexes:,您可以在其中处理文件。在您的 tableView:writeRowsWithIndexes:toPasteboard: 方法中,您将声明 NSFilesPromisePboardType,然后为您计划写入的文件类型设置一个文件扩展名数组。以下是概述您可能如何处理它的伪代码:

- (BOOL)tableView:(NSTableView *)aTableView
writeRowsWithIndexes:(NSIndexSet *)rowIndexes
toPasteboard:(NSPasteboard *)pboard {
[pboard declareTypes:[NSArray arrayWithObjects:NSFilesPromisePboardType, nil]];

NSMutableArray *filenameExtensions = [NSMutableArray array];
NSArray *draggedFilenames = [self.files objectsAtIndexes:rowIndexes];
for (NSString *filename in draggedFilenames) {
NSString *filenameExtension = [filename pathExtension];
if (filenameExtension.length) {
[filenameExtensions addObject:filenameExtension];
}
}
[pboard setPropertyList:filenameExtensions
forType:NSFilesPromisePboardType];
return YES;
}

然后在您的 names-of-promisedFiles 方法中:

- (NSArray *)tableView:(NSTableView *)aTableView
namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestination
forDraggedRowsWithIndexes:(NSIndexSet *)indexSet {

NSArray *draggedFilenames = [self.files objectsAtIndexes:indexSet];

for (NSString *filename in draggedFilenames) {
// do your processing of files in here
// if it may take a long time, you might need to do it on a background
// thread

NSString *fullPathToOriginal = nil;
NSString *destPath =
[[dropDestination path] stringByAppendingPathComponent:filename];


}
return draggedFilenames;
}

您应该能够计算原始文件路径(不确定您是如何确定的,所以我在上面的代码中将其保留为 nil)和目标文件路径(使用类似上面的代码)。

关于objective-c - 从 NSTableView 拖放到 Finder 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6674552/

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