tas*_*ock 3 macos cocoa drag-and-drop objective-c
我想从NSTableView行拖动一个文件,将其复制到另一个应用程序(即Finder).我实现了本指南的前两个步骤("配置您的表视图","开始拖动操作")并认为可以解决这个问题:http: //developer.apple.com/library/mac/#documentation/Cocoa /Conceptual/TableView/Tasks/UsingDragAndDrop.html
但是,当我尝试拖动一行时,行文本跟在鼠标后面,但文件在释放时不会复制.这是我在初始化时发送到我的UITableView的内容:
#define librarySongDataType @"NSFileContentsPboardType"
- (void)awakeFromNib
{
[self setDraggingSourceOperationMask:NSUIntegerMax forLocal:YES]; // allow interapplication drags
[self registerForDraggedTypes:[NSArray arrayWithObject:librarySongDataType] ]; // NSFileContentsPboardType
}
Run Code Online (Sandbox Code Playgroud)
这是我在NSTableView的数据源(NSArrayController)中处理拖动的方法:
- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard
{
NSLog(@"writeRowsWithIndexes");
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes];
[pboard setData:data forType:librarySongDataType];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
要清楚,我不是试图将文件拖到我的表视图中,我只是试图将文件拖出来.
Yuj*_*uji 10
首先,你在撰写这一行时提到了哪个文件?
[self setDraggingSourceOperationMask:NSUIntegerMax forLocal:YES];
Run Code Online (Sandbox Code Playgroud)
这没有意义.不要用NSUIntegerMax.使用此处定义的操作掩码.它写在那里NSUIntegerMax代表一切,但你不应该使用它; Apple可能会在未来重新定义该位.你应该使用NSDragOperationCopy或具体的东西.如果您从网页或图书中复制该行,则应停止信任该图书/网页.
其次,forLocal:应该将NO数据传递给另一个应用程序; local这意味着应用本地.
第三,而不是仅仅设置存档数据
[pboard setData:data forType:librarySongDataType];
Run Code Online (Sandbox Code Playgroud)
考虑制作NSFileWrapper并使用它writeFileWrapper:,请参见此处.这样,您可以指定要在Finder中创建的文件名.否则,系统不知道数据代表什么.
| 归档时间: |
|
| 查看次数: |
2042 次 |
| 最近记录: |