检测拖拽的文件路径

415 阅读1分钟

拖拽是常见的交互形式,在图形化界面中拖拽操作更加直观。

实现NSDraggingDestination

拖拽后的检测主要由NSDraggingDestination实现,NSView已经实现protocol。

  1. 调用registerForDraggedTypes注册需要监视的类型,如果是拖拽的文件的话,使用.fileURL
  2. 实现draggingEntered函数,因为第三步中的函数依赖于该函数返回一个可使用的值。
  3. 重新定义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;
}