2010-07-08 5 views
1

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

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

ответ

1

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

+0

Спасибо, что посмотрю. – nosedive25

+0

Неясные вопросы дают неопределенные ответы; приятно, что у вас есть время написать демо-класс для оригинального плаката, но не у всех. Попытка постыдить кого-то почти через четыре года после того, как факт, возможно, менее всего полезен для любого действия ... –

+0

Неверно, его строка: p Вы можете использовать его с помощью '[NSArray arrayWithObject: NSFilenamesPboardType]' –

5
  1. сделать класс с именем DragDropView, что подкласс NSView и установить вид в MainMenu.xib быть таким типа (Выберите вид, перейдите к идентичности Inspecor и писать DragDropView в пользовательском классе).

  2. Напишите код (см. Ниже) для DragDropView и запустите его. Должно появиться пустое окно.

  3. Перетащите несколько папок на свое окно. Вы должны получить пути к папкам, написанным на консоли. Что-то вроде.

2014-02-01 11: 18: 10,435 Начало [41767: 303] ( "/ Пользователи/боб/Рабочий стол/Верески анимации", " /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 
+0

Реализация Swift 3: https://gist.github.com/128keaton/e6030ddbcedabe10f1a834cd269f13dc –

Смежные вопросы