我需要在cocoa中创建一个可以接受文件夹的拖放视图。我知道它会使用像NSView这样的东西,可能还有registerForDraggedTypes :(我仍然不确定如何使用)。有谁知道如何使这个工作?
提前致谢
答案 0 :(得分:5)
创建一个名为DragDropView的类,它将NSView子类化,并将MainMenu.xib中的视图设置为此类型(选择视图,转到Identity Inspecor并在Custom Class中编写DragDropView)。
为DragDropView编写代码(见下文)并运行它。应出现一个空窗口。
将一些文件夹拖到窗口上。您应该获得在控制台中写入的文件夹的路径。类似的东西。
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。如果是文件路径,它就是一个数组。