我创建了一个具有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似乎并不接受这种格式作为有效格式.
我检查了Google,我发现了一些建议,你可以创建一个临时文件并使用该文件路径.但是,这感觉很难看.
是否可以向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; }
然后在你的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; }
您应该能够计算原始文件路径(不确定您是如何确定它的,所以我在上面的代码中保留了它)和目标文件路径(使用上面代码中的内容).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。