2010-07-08 113 views
1

我需要在可可中進行拖放視圖以接受文件夾。我知道它會使用像NSView和可能registerForDraggedTypes:(我仍然不知道如何去使用)。有誰知道如何得到這個工作?拖放文件夾視圖可可

在此先感謝

回答

1

大多數時候,你需要的是在拖放文檔,但是特別需要什麼NSFilenamesPboardType。這是一個數組,如果文件路徑。

+0

謝謝,我來看看。 – nosedive25 2010-07-09 02:04:39

+0

模糊的問題得到模糊的答案;很高興您有時間爲原創海報撰寫演示課,但不是每個人都會這樣做。試圖在事實發生近四年後羞辱某人,然而,可以說是任何行動中最沒有幫助的...... – 2014-02-01 15:17:56

+0

錯誤,它的字符串:p您可以使用它與'[NSArray arrayWithObject:NSFilenamesPboardType]' – 2016-01-02 09:11:20

5
  1. 建立一個叫做DragDropView類的子類的NSView並設置視圖MainMenu.xib是這種類型的(選擇你的觀點,去身份Inspecor和自定義類寫DragDropView)。

  2. 爲DragDropView編寫代碼(見下文)並運行它。應該出現一個空的窗口。

  3. 將一些文件夾拖到窗口上。你應該得到你的控制檯中寫入的文件夾的路徑。就像是。

2014年2月1日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 – 2017-01-03 06:09:21