拖放 - 仅接受文件夹

Posted

技术标签:

【中文标题】拖放 - 仅接受文件夹【英文标题】:Drag and Drop — Only Folders Accepted 【发布时间】:2011-09-06 16:35:11 【问题描述】:

我正在编写一个需要接受文件夹删除的自定义视图。条件是:只接受目录,所以当用户拖动文件时什么都不会发生。

我已将我的视图注册到:

[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];

并且已经实现了基本的拖动协议方法。出于测试目的:

- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender

    NSLog("@Drag Entered");
    return NSDragOperationCopy;


- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender

    return NSDragOperationCopy;


- (void)draggingExited:(id<NSDraggingInfo>)sender

    NSLog(@"Dragging Exited");


- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender  return YES; 
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender     return YES; 

所以它几乎可以正常工作:光标在视图上拖动时会出现一个加号。但是,如果该项目是常规文件,我想避免这种情况。

一旦我得到拖动的路径,我可能需要使用 NSFileManager 执行此操作(尽管我想知道是否有更简单的方法),但问题是在哪里。我试图将测试权包含在返回 NSDragOperationNonedraggingEntered: 方法中,但没有成功。我正在关注 Apple 文档中的 sn-p:


    NSPasteboard *pboard = [sender draggingPasteboard];

    if ( [[pboard types] containsObject:NSFilenamesPboardType] ) 
        NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
        int numberOfFiles = [files count];
        // Perform operation using the list of files
    
    return YES;

我应该在哪里实现这个测试,所以如果拖动文件,光标会保持不变?

【问题讨论】:

【参考方案1】:

您应该在-draggingEntered: 中实施测试,如果粘贴板包含文件,则返回NSDragOperationNone

但是,由于您还实现了‑draggingUpdated:,因此您还需要将文件夹类型的测试添加到该方法中。

目前你总是在‑draggingUpdated:中返回NSDragOperationCopy而不测试文件类型,这意味着只要鼠标移动到你的拖动目的地,无论你做什么,光标都会变成复制光标在‑draggingEntered:做。

请注意,实现‑draggingUpdated: 是可选的。如果您没有实现具有多个可能的拖动目标的复杂视图,那么您不需要实现它,只需 ‑draggingEntered:‑draggingExited:

【讨论】:

哦,伙计,正如我在文中所说,我已经在draggingEntered: 中实施了测试,但在draggingUpdated: 中没有抓住重点。刚刚删除它。非常感谢! 理想情况下,在单独的方法中只执行一次测试,然后从draggingEntered:draggingUpdated: 向自己发送该消息。

以上是关于拖放 - 仅接受文件夹的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa:拖放任何文件类型

CSS 指针事件 – 接受拖动,拒绝点击

SwiftUI 拖放文件

qt 拖放dropEvent

java/swing:两个子窗口的拖放问题

使用 SendInput 模拟拖放操作