拖放文件夹视图可可

nos*_*e25 1 cocoa drag-and-drop nsview

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

提前致谢

Bob*_*and 5

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

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

  3. 将一些文件夹拖到窗口上.您应该获得在控制台中写入的文件夹的路径.就像是.

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