拖拽是常见的交互形式,在图形化界面中拖拽操作更加直观。
实现NSDraggingDestination
拖拽后的检测主要由NSDraggingDestination实现,NSView已经实现protocol。
- 调用
registerForDraggedTypes注册需要监视的类型,如果是拖拽的文件的话,使用.fileURL。 - 实现
draggingEntered函数,因为第三步中的函数依赖于该函数返回一个可使用的值。 - 重新定义
prepareForDragOperation,在该函数中,可以获取到文件信息
示例代码
class DragDropView
- (id)initWithFrame:(NSRect)frame{
self = [super initWithFrame:frame];
if (self) {
//这里我们只添加对文件进行监听,如果拖动其他数据类型到view中是不会被接受的
[self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
}
return** self;
}
- (**instancetype**)init{
self = [super init];
if (self) {
//这里我们只添加对文件进行监听,如果拖动其他数据类型到view中是不会被接受的
[self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
}
return self;
}
-(NSDragOperation)draggingEntered:(**id**<NSDraggingInfo>)sender{
NSPasteboard *pboard = [sender draggingPasteboard];
if ([[pboard types] containsObject:NSFilenamesPboardType]) {
return NSDragOperationCopy;
}
return NSDragOperationNone;
}
-(BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender{
// 1)、获取拖动数据中的粘贴板
NSPasteboard *zPasteboard = [sender draggingPasteboard];
// 2)、从粘贴板中提取我们想要的NSFilenamesPboardType数据,这里获取到的是一个文件链接的数组,里面保存的是所有拖动进来的文件地址,如果你只想处理一个文件,那么只需要从数组中提取一个路径就可以了。
NSArray *list = [zPasteboard propertyListForType:NSFilenamesPboardType];
// 3)、将接受到的文件链接数组通过代理传送
if(self.delegate && [self.delegate respondsToSelector: @selector(dragDropViewFileList:)])
[self.delegate dragDropViewFileList:list];
return YES;
}