[Cocoa]_[初级]_[文件拖放操作]
2015-11-22 17:43
363 查看
场景:支持所有类别的文件拖放(从外部直接拖文件到程序中)
1.首先要支持文件拖放,肯定要有一个放的位置,这里我们定义一个DragDropView来接收鼠标拖进来的文件。
2.对View进行注册拖放事件的监听[self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];,可以监听多种类型,常用类型为:
NSStringPboardType 字符串类型
NSFilenamesPboardType 文件
NSURLPboardType url链接
NSPDFPboardType pdf文件
NSHTMLPboardType html文件
3.注册拖放事件监听之后,对鼠标拖放的文件进行接收,并把文件放到剪切版上
设置方法:-(NSDragOperation) draggingEntered:(id<NSDraggingInfo>)sender,如果拖放的文件符合注册拖放事件监听所支持的类型,则返回NSDragOperationCopy
,否则返回 NSDragOperationNone。
4.获取拖放的文件,从剪切版上获取之前拖放进来的文件
方法:-(BOOL) prepareForDragOperation:(id<NSDraggingInfo>)sender,获取拖放文件之后,把文件数组传递给DragDropView的代理方法,所以我们还要给DragDropView设置一个代理方法,方便对拖放的文件进行操作。
5.设置DragDropView的代理方法
@property(assign) IBOutlet id<DragDropViewDelegate> delegate;
@protocol DragDropViewDelegate <NSObject>
//设置代理方法
-(void) doGetDragDropArrayFiles:(NSArray*) fileLists;
@end
总结:NSView支持文件拖放,主要步骤是注册拖放时间的监听器,设置监听的文件类型,接收拖放事件的方法,获取拖放文件的方法,设置View的代理,总共5步。
示例代码:
DragDropView.h
DragDropView.m
//设置鼠标拖放文件的动作,如果不重置,拖放的文件会有一个回退到原位置的动作轨迹。
-(BOOL) performDragOperation:(id<NSDraggingInfo>)sender;返回YES,拖放文件没有回退动作轨迹,返回NO,则有回退动作轨迹
MqjDragDopDelegate.h
MqjDragDopDelegate.m
运行结果:
操作:
结果:
项目代码:
http://download.csdn.net/detail/moqj_123/9290897
1.首先要支持文件拖放,肯定要有一个放的位置,这里我们定义一个DragDropView来接收鼠标拖进来的文件。
2.对View进行注册拖放事件的监听[self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];,可以监听多种类型,常用类型为:
NSStringPboardType 字符串类型
NSFilenamesPboardType 文件
NSURLPboardType url链接
NSPDFPboardType pdf文件
NSHTMLPboardType html文件
3.注册拖放事件监听之后,对鼠标拖放的文件进行接收,并把文件放到剪切版上
设置方法:-(NSDragOperation) draggingEntered:(id<NSDraggingInfo>)sender,如果拖放的文件符合注册拖放事件监听所支持的类型,则返回NSDragOperationCopy
,否则返回 NSDragOperationNone。
4.获取拖放的文件,从剪切版上获取之前拖放进来的文件
方法:-(BOOL) prepareForDragOperation:(id<NSDraggingInfo>)sender,获取拖放文件之后,把文件数组传递给DragDropView的代理方法,所以我们还要给DragDropView设置一个代理方法,方便对拖放的文件进行操作。
5.设置DragDropView的代理方法
@property(assign) IBOutlet id<DragDropViewDelegate> delegate;
@protocol DragDropViewDelegate <NSObject>
//设置代理方法
-(void) doGetDragDropArrayFiles:(NSArray*) fileLists;
@end
总结:NSView支持文件拖放,主要步骤是注册拖放时间的监听器,设置监听的文件类型,接收拖放事件的方法,获取拖放文件的方法,设置View的代理,总共5步。
示例代码:
DragDropView.h
#import <Cocoa/Cocoa.h> @protocol DragDropViewDelegate; @interface DragDropView : NSView //设置代理 @property(assign) IBOutlet id<DragDropViewDelegate> delegate; @end @protocol DragDropViewDelegate <NSObject> //设置代理方法 -(void) doGetDragDropArrayFiles:(NSArray*) fileLists; @end
DragDropView.m
#import "DragDropView.h" @implementation DragDropView @synthesize delegate =_delegate; -(void) dealloc { [self setDelegate:nil]; [super dealloc]; } //有时候初始化frame不响应,所有在awakeFromNib中设置只添加对文件进行监听 - (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (self) { /*** 第一步:帮助view注册拖动事件的监听器,可以监听多种数据类型,这里只列出比较常用的: NSStringPboardType 字符串类型 NSFilenamesPboardType 文件 NSURLPboardType url链接 NSPDFPboardType pdf文件 NSHTMLPboardType html文件 ***/ //这里我们只添加对文件进行监听,如果拖动其他数据类型到view中是不会被接受的 [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]]; } return self; } -(void) awakeFromNib { //这里我们只添加对文件进行监听,如果拖动其他数据类型到view中是不会被接受的 [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]]; } // -(NSDragOperation) draggingEntered:(id<NSDraggingInfo>)sender { NSPasteboard *pb =[sender draggingPasteboard]; NSArray *array=[pb types]; if ([array containsObject:NSFilenamesPboardType]) { return NSDragOperationCopy; } return NSDragOperationNone; } // -(BOOL) prepareForDragOperation:(id<NSDraggingInfo>)sender { NSPasteboard *pb =[sender draggingPasteboard]; NSArray *list =[pb propertyListForType:NSFilenamesPboardType]; if (self.delegate && [self.delegate respondsToSelector:@selector(doGetDragDropArrayFiles:)]) { [self.delegate doGetDragDropArrayFiles:list]; } return YES; } -(void) drawRect:(NSRect)dirtyRect { NSColor *color =[NSColor blueColor]; [color set]; NSRectFill(dirtyRect); } @end
//设置鼠标拖放文件的动作,如果不重置,拖放的文件会有一个回退到原位置的动作轨迹。
-(BOOL) performDragOperation:(id<NSDraggingInfo>)sender;返回YES,拖放文件没有回退动作轨迹,返回NO,则有回退动作轨迹
MqjDragDopDelegate.h
#import <Cocoa/Cocoa.h> #import "DragDropView.h" @interface MqjDragDopDelegate : NSObject<DragDropViewDelegate> { IBOutlet NSTextField *pathText; } @end
MqjDragDopDelegate.m
#import "MqjDragDopDelegate.h" @implementation MqjDragDopDelegate #pragma mark -(void) doGetDragDropArrayFiles:(NSArray*) fileLists { NSString *path =@""; for (NSString *content in fileLists) { path =[path stringByAppendingFormat:@"%@\n",content]; } [pathText setStringValue:path]; } @end
运行结果:
操作:
结果:
项目代码:
http://download.csdn.net/detail/moqj_123/9290897
相关文章推荐
- Swift、Objective-C、Cocoa混合编程设置指南
- 在Swift中使用Cocoa的现有设计模式介绍
- Swift使用Cocoa中的数据类型教程
- windows下objective-c的cocoa框架编程,可以有图形界面哟
- Cocoa 之多线程 NSThread
- Mac 点击dock图标显示窗口,点击关闭按钮隐藏窗口
- 隐藏窗口里默认按钮的方法NSWindowCloseButton
- cocoa 点击关闭按钮退出应用程序
- 编译错误“The run destination My Mac 64-bit is not valid for Running the scheme '***',解决办法
- cocoa 在dock上添加菜单
- [CS193P] 第一堂課摘要及心得筆記
- [CS193P] 第三堂課摘要及心得筆記
- [CS193P] 第六堂課摘要及心得筆記
- 【热门收藏】iOS开发人员必看的精品资料(100个)——下载目录
- IOS里面一些基础类型的使用点
- 关于IOS 开发 中的一些小技巧
- KVO (NSKeyValueObserving)
- 谓词NSPredicate
- Cocoa 关闭显示屏 (dim the display)
- Cocoa 获取一个独特的电脑硬件ID (A unique hardware id)