拖放文件夹视图可可

时间:2010-07-08 20:36:59

标签: cocoa drag-and-drop nsview

我需要在cocoa中创建一个可以接受文件夹的拖放视图。我知道它会使用像NSView这样的东西,可能还有registerForDraggedTypes :(我仍然不确定如何使用)。有谁知道如何使这个工作?

提前致谢

2 个答案:

答案 0 :(得分:5)

  1. 创建一个名为DragDropView的类,它将NSView子类化,并将MainMenu.xib中的视图设置为此类型(选择视图,转到Identity Inspecor并在Custom Class中编写DragDropView)。

  2. 为DragDropView编写代码(见下文)并运行它。应出现一个空窗口。

  3. 将一些文件夹拖到窗口上。您应该获得在控制台中写入的文件夹的路径。类似的东西。

  4. 2014-02-01 11:18:10.435开始[41767:303](     “/ Users / bob / Desktop / Heathers Animations”,     “/Users/bob/Desktop/bird.atlas” )

    // DragDropView.h
    #import <Cocoa/Cocoa.h>
    
    @interface DragDropView : NSView
    
    @end
    
    // DragDropView.m
    #import "DragDropView.h"
    
    @implementation DragDropView {
        BOOL isHighlighted;
    }
    
    - (void)awakeFromNib {
        [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
    }
    
    - (BOOL)isHighlighted {
        return isHighlighted;
    }
    
    - (void)setHighlighted:(BOOL)value {
        isHighlighted = value;
        [self setNeedsDisplay:YES];
    }
    
    - (void)drawRect:(NSRect)frame {
        [super drawRect:frame];
        if (isHighlighted) {
            [NSBezierPath setDefaultLineWidth:6.0];
            [[NSColor keyboardFocusIndicatorColor] set];
            [NSBezierPath strokeRect:frame];
        }
    }
    
    
    #pragma mark - Dragging
    
    - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
        NSPasteboard *pboard = [sender draggingPasteboard];
    
        if ([[pboard types] containsObject:NSFilenamesPboardType]) {
            NSArray *paths = [pboard propertyListForType:NSFilenamesPboardType];
            for (NSString *path in paths) {
                NSError *error = nil;
                NSString *utiType = [[NSWorkspace sharedWorkspace]
                                     typeOfFile:path error:&error];
                if (![[NSWorkspace sharedWorkspace]
                      type:utiType conformsToType:(id)kUTTypeFolder]) {
    
                    [self setHighlighted:NO];
                    return NSDragOperationNone;
                }
            }
        }
        [self setHighlighted:YES];
        return NSDragOperationEvery;
    }
    
    - (void)draggingExited:(id <NSDraggingInfo>)sender {
        [self setHighlighted:NO];
    }
    
    
    - (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender  {
        return YES;
    }
    
    - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
        [self setHighlighted:NO];
        return YES;
    }
    
    - (void)concludeDragOperation:(id<NSDraggingInfo>)sender {
        NSArray *files = [[sender draggingPasteboard] propertyListForType:NSFilenamesPboardType];
        NSLog(@"%@", files);
    }
    
    @end
    

答案 1 :(得分:1)

您需要的大部分内容都在拖放文档中,但具体需要的是NSFilenamesPboardType。如果是文件路径,它就是一个数组。