macOS拖拽文件完美解决方案,兼容各个版本

#import <Cocoa/Cocoa.h>

NS_ASSUME_NONNULL_BEGIN

@protocol SHReadFileViewDelegate <NSObject>

- (void)receivedFileUrlList:(NSArray<NSURL *> *)fileUrls;
- (NSDragOperation)quaryDragOperation:(NSArray *)list;

@end

@interface SHReadFileView : NSView

@property (weak, nonatomic) IBOutlet id<SHReadFileViewDelegate> readDelegate;

@end

NS_ASSUME_NONNULL_END


#import "SHReadFileView.h"


@implementation SHReadFileView

- (id)initWithFrame:(NSRect)frameRect {
    self = [super initWithFrame:frameRect];
    if (self) {
        //注册文件拖动事件
        if (@available(macOS 10.13, *)) {
            [self registerForDraggedTypes:[NSArray arrayWithObjects:NSPasteboardTypeFileURL, nil]];
        } else if (@available(macOS 10.0, *)){
            // Fallback on earlier versions
            [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
        }
    }
    return self;
}

- (void)awakeFromNib {
    [super awakeFromNib];
    //注册文件拖动事件
    if (@available(macOS 10.13, *)) {
        [self registerForDraggedTypes:[NSArray arrayWithObjects:NSPasteboardTypeFileURL, nil]];
    } else if (@available(macOS 10.0, *)){
        // Fallback on earlier versions
        [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
    }
}

- (void)dealloc {
    [self unregisterDraggedTypes];
}

//当文件被拖动到界面触发
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
    NSPasteboard *pboard;
    NSDragOperation sourceDragMask;
    
    sourceDragMask = [sender draggingSourceOperationMask];
    pboard = [sender draggingPasteboard];
    if (@available(macOS 10.13, *)) {
        if ( [[pboard types] containsObject:NSPasteboardTypeFileURL] ) {
            if (sourceDragMask & NSDragOperationLink) {
                NSArray *list = [pboard readObjectsForClasses:@[[NSURL class]] options:nil];
                return [self.readDelegate quaryDragOperation:list];
            } else if (sourceDragMask & NSDragOperationCopy) {
                return NSDragOperationCopy;//拖动会变成+号
            }
        }
    } else {
        if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
            if (sourceDragMask & NSDragOperationLink) {
                NSArray *list = [pboard propertyListForType:NSFilenamesPboardType];
                //[pboard readObjectsForClasses:@[[NSURL class]] options:nil];
                return [self.readDelegate quaryDragOperation:list];
            } else if (sourceDragMask & NSDragOperationCopy) {
                return NSDragOperationCopy;//拖动会变成+号
            }
        }
    }
    return NSDragOperationNone;
}

//当文件在界面中放手
-(BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender{
    NSPasteboard *zPasteboard = [sender draggingPasteboard];
    NSArray *list;
    if (@available(macOS 10.13, *)) {
        //获取的路径看不懂,需要通过bookmark才能转成能看懂的磁盘路径
        list = [zPasteboard readObjectsForClasses:@[[NSURL class]] options:nil];
    } else {
        list = [zPasteboard propertyListForType:NSFilenamesPboardType];
    }
     
    NSMutableArray *urlList = [NSMutableArray array];
    for (NSObject *obj in list) {
        if ([obj isKindOfClass:[NSURL class]]) {
            [urlList addObject:(NSURL *)obj];
        } else if ([obj isKindOfClass:[NSString class]]) {
            NSURL *url = [NSURL fileURLWithPath:(NSString *)obj];
            [urlList addObject:url];
        }
    }
    if (urlList.count && self.readDelegate) {
        [self.readDelegate receivedFileUrlList:urlList];
    }
    return YES;
}

@end

macOS开发 - 文件拖放 DragDropView 的 'NSFilenamesPboardType' is deprecated

Mac os - 添加文件拖动 单文件、多文件支持

macOS 开发 - 讨论 drag-drop

macOS 拖拽操作Drag和Drop (一)

macOS 开发 - Drag & Drop 拖拽的基本使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值