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

Mr *_*eph 9 macos cocoa objective-c

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

NSInteger result  = [openPanel runModalForDirectory:nil file:nil types:fileTypes];
Run Code Online (Sandbox Code Playgroud)

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

在你告诉我去阅读文档之前,我已经检查了Apple的简介以进行拖放和其他文档.我仍然无法弄清楚该怎么做.

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

简而言之,我需要将哪些内容添加到我的应用中:

  1. 启用拖放功能
  2. 处理拖动的文件

作为一个注释,我应该一次只处理一个文件.

谢谢您的帮助

Fra*_*rew 16

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

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

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

- (void)awakeFromNib {
    [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];
}
Run Code Online (Sandbox Code Playgroud)

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

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

- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender {
    return NSDragOperationCopy;
}
Run Code Online (Sandbox Code Playgroud)

拖动:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

这是让它工作的最低要求.