接受Cocoa应用程序上的拖动文件

时间:2011-12-19 20:46:57

标签: objective-c macos cocoa

我有一个处理营销信息的简单应用程序。我做的是致电

NSInteger result  = [openPanel runModalForDirectory:nil file:nil types:fileTypes];

当用户点击File->Open菜单时。现在我被要求向应用程序添加拖放功能,以便用户可以将文件拖到它上,而不必转到菜单或按下命令+ o打开文件。

在您告诉我去阅读文档之前,我已经检查了Apple的Intro to drag and drop和其他文档。我仍然无法弄清楚该怎么做。

我是一个老的Unix C程序员,需要复制这个,Apple的文档中的一些假设对我来说没有意义。

简而言之,我需要将我的应用添加到:

  1. 启用拖放功能
  2. 处理拖动的文件
  3. 作为一个注释,我一次只能处理一个文件。

    感谢您的帮助

1 个答案:

答案 0 :(得分:16)

嗯,你需要实现NSDraggingDestination协议,我认为你已经阅读过了。您可以在特定视图或整个窗口中实现它 - 听起来您正在接受应用程序级文件拖动,因此您可能希望整个窗口接受拖动。无论如何,一旦你开始工作,你将看到如何进一步定制它。

子类NSWindow。第一步是指定您感兴趣的拖拉类型。

告诉您的自定义窗口它对文件名感兴趣:

- (void)awakeFromNib {
    [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];
}

告诉OS X要显示哪种光标:

- (NSDragOperation)draggingEntered:(id < NSDraggingInfo >)sender {
    return NSDragOperationCopy;
}

- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender {
    return NSDragOperationCopy;
}

拖动:

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
    NSPasteboard *pboard = [sender draggingPasteboard];
    NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType];

    if (1 == filenames.count)
        if ([[NSApp delegate] respondsToSelector:@selector(application:openFile:)])
            return [[NSApp delegate] application:NSApp openFile:[filenames lastObject]];

    return NO;
}

这是使其正常工作的最低要求。