Перетащите папка вид какао - PullRequest
1 голос
/ 09 июля 2010

Мне нужно сделать вид перетаскивания в какао, который будет принимать папки.Я знаю, что он будет использовать такие вещи, как NSView и, вероятно, registerForDraggedTypes: (который я до сих пор не уверен, как использовать).Кто-нибудь знает, как заставить это работать?

Заранее спасибо

Ответы [ 2 ]

5 голосов
/ 01 февраля 2014
  1. Создайте класс с именем DragDropView, который подклассов NSView, и задайте для этого вида представление в MainMenu.xib этого типа (выберите свое представление, перейдите в Identity Inspecor и напишите 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
1 голос
/ 09 июля 2010

Большая часть того, что вам нужно, находится в документации по перетаскиванию, но в особенности вам нужен NSFilenamesPboardType. Это массив, если пути к файлам.

...