读取多个拖拽的文件

时间:2013-05-08 20:51:08

标签: objective-c macos osx-mountain-lion nspasteboard nsdragginginfo

我在主xib(MainMenu.xib)中有一个小窗口,带有 NSImageView 控件,用于 OS X 应用程序。这个视图控件有一个NSImageView子类,它应该接受用户带来的文件(拖放)。由于我没有使用Objective-C开发Mac应用程序的经验,所以我一直在搜索,查看Apple的一些示例项目,并得到一些想法。好吧,为了简化故事,我刚刚复制了发布的代码here。有用。太棒了......以下是简洁版。

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

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

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

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

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
    NSPasteboard *pboard = [sender draggingPasteboard];
    if ([[pboard types] containsObject:NSURLPboardType]) {
        NSURL *fileURL = [NSURL URLFromPasteboard:pboard];
        NSLog(@"Path: %@", [self convertPath:fileURL]); // <== That's just what I need
    }
    return YES;
}

- (NSString *)convertPath:(NSURL *)url {
    return url.path;
}

现在,下拉框只能一次获取一个文件路径,而不管用户拖放到下拉框中的文件数量。所以我想知道的是如何让应用程序读取用户带来的所有多个文件。

谢谢,

2 个答案:

答案 0 :(得分:12)

将performDragOperation:方法更改为:

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
    NSPasteboard *pboard = [sender draggingPasteboard];
    if ([[pboard types] containsObject:NSURLPboardType]) {
        NSArray *urls = [pboard readObjectsForClasses:@[[NSURL class]] options:nil];
        NSLog(@"URLs are: %@", urls); 
    }
    return YES;
}

答案 1 :(得分:2)

斯威夫特风格:

override func performDragOperation(sender: NSDraggingInfo) -> Bool 
{
    if let board = sender.draggingPasteboard().propertyListForType(NSFilenamesPboardType) as? NSArray 
    {              
        for imagePath in board
        {
            if let path = imagePath as? String
            {
                 println("path: \(path)")
            }
        }                
        return true               
    }
    return false
}