案例079 实现文件拖进拽出
2014-03-01 10:26
316 查看
案例说明:
MAC系统中的Find是支持拖放操作的,当拖拽文件的对象经过自己的应用程序窗口时,用户往往需要获取被选中文件的文件名,从而可以以自己的方式对文件做一定的处理。有时候希望自己的程序中显示的数据能绑定文件的路径,并能把其指定的文件,通过该程序拽出到其他程序或桌面。本案例实现了拖放文件到列表视图,获取文件路径绑定到列表视图的数据记录项目。还实现了列表视图的数据记录项目所绑定的文件路径指认的文件,从程序拽出到其他程序或桌面。案例运行界面如下图所示。
关键技术:
通过MAC系统中的TableView控件的绑定技术和系统粘贴板类,可以非常容易实现本案例所要展现的功能。NSPasteboard类的主要类型定义如下:
NSString *NSStringPboardType;//普通类型粘贴板
NSString *NSFilenamesPboardType;//文件类型粘贴板,用于复制文件
NSString *NSPostScriptPboardType;//HTML中JS的类型粘贴板
NSPasteboard类注册绑定到TableView控件代码如下:
- (void) awakeFromNib
{
//Register to accept filename drag/drop
[selfregisterForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];}
实现TableView控件中粘贴板操作的代理事件的代码如下:
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
{
if ([selfdelegate]==nil)
{
returnNSDragOperationNone;
}
if([[[sender draggingPasteboard] types] containsObject:NSFilenamesPboardType])
{
returnNSDragOperationCopy;
}
returnNSDragOperationNone; }
实现过程:
首先在InterfaceBuilder中拖进一个Table View,拖进一个Object改名为Controller,再拖进一个ArrayController。在Controller里添加一个叫做arrayController的outlet,用菜单中的WriteClass自动生成代码并添加至工程中,将arrayController从id类型改为ArrayController*。接着把这个outlet和ArrayController连接起来。将Array Controller绑定至Controller,将Model
KeyPath改为filenames。
将TableView的类改名为DragDropTableView,我们要subclass这个TableView,用于接受拖拽,同时将TableView的delegate设置为Controller。将这个类WriteClass保存并添加至工程中。 接着选中TableView的第一列,将其绑定到Array Controller上。这样,ArrayController的任何变化,都将自动反应到这一列中。 实现在TableView中添加内容,增加一行文件的数据记录,只需要调用如下方法:
- (void) acceptFilenameDrag:(NSString *) filename
{
[filenames2 addObject:filename ] ;
NSString* disp = [ NSString stringWithFormat:@"拖拽测试%d", [filenames2 count] ] ;
[arrayControlleraddObject:disp]; }
要使View支持接受拖进文件,需要实现performDragOperation 方法的函数的代码如下:
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender
{
//实现文件的拖进到程序
int i;
NSPasteboard*pboard;
pboard =[sender draggingPasteboard];
if([[pboard types] containsObject:NSFilenamesPboardType])
{
iddelegate = [self delegate];
NSArray*filenames = [pboard propertyListForType:NSFilenamesPboardType];
if([delegate respondsToSelector:@selector(acceptFilenameDrag:)])
{
for(i=0;i<[filenames count];i++)
{
[delegateperformSelector:@selector(acceptFilenameDrag:) withObject:[filenamesobjectAtIndex:i]];
}
}
returnYES;
}
returnNO; }
要使View支持拽出文件,需要实现如下代码:
- (BOOL)tableView:(NSTableView *)tableView
writeRowsWithIndexes:(NSIndexSet *)rowIndexes
toPasteboard:(NSPasteboard *)pboard
{
//实现文件从程序拽出,通过剪贴板实现
NSUInteger i = 0 ;
NSMutableArray *files = [ [[NSMutableArray alloc] init] autorelease ];
for( i =[rowIndexes firstIndex ] ; i <= [rowIndexes lastIndex ] && i<[filenames2 count] ; i ++ )
{
[files addObject:[filenames2 objectAtIndex:i] ];
}
[pboarddeclareTypes:[NSArray arrayWithObjects: NSFilenamesPboardType,nil] owner:nil]; [pboardsetPropertyList:files forType:NSFilenamesPboardType];
returnYES; }
最佳实践:
本案例重点介绍了粘贴板的使用,通过研究本案例可以掌握NSTableView、绑定以及剪贴板的简单使用方法。拖拽功能在QQ,音乐播放器等软件中都有具体的应用,掌握该技术对于具体项目实践有重要意义。
MAC系统中的Find是支持拖放操作的,当拖拽文件的对象经过自己的应用程序窗口时,用户往往需要获取被选中文件的文件名,从而可以以自己的方式对文件做一定的处理。有时候希望自己的程序中显示的数据能绑定文件的路径,并能把其指定的文件,通过该程序拽出到其他程序或桌面。本案例实现了拖放文件到列表视图,获取文件路径绑定到列表视图的数据记录项目。还实现了列表视图的数据记录项目所绑定的文件路径指认的文件,从程序拽出到其他程序或桌面。案例运行界面如下图所示。
关键技术:
通过MAC系统中的TableView控件的绑定技术和系统粘贴板类,可以非常容易实现本案例所要展现的功能。NSPasteboard类的主要类型定义如下:
NSString *NSStringPboardType;//普通类型粘贴板
NSString *NSFilenamesPboardType;//文件类型粘贴板,用于复制文件
NSString *NSPostScriptPboardType;//HTML中JS的类型粘贴板
NSPasteboard类注册绑定到TableView控件代码如下:
- (void) awakeFromNib
{
//Register to accept filename drag/drop
[selfregisterForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];}
实现TableView控件中粘贴板操作的代理事件的代码如下:
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
{
if ([selfdelegate]==nil)
{
returnNSDragOperationNone;
}
if([[[sender draggingPasteboard] types] containsObject:NSFilenamesPboardType])
{
returnNSDragOperationCopy;
}
returnNSDragOperationNone; }
实现过程:
首先在InterfaceBuilder中拖进一个Table View,拖进一个Object改名为Controller,再拖进一个ArrayController。在Controller里添加一个叫做arrayController的outlet,用菜单中的WriteClass自动生成代码并添加至工程中,将arrayController从id类型改为ArrayController*。接着把这个outlet和ArrayController连接起来。将Array Controller绑定至Controller,将Model
KeyPath改为filenames。
将TableView的类改名为DragDropTableView,我们要subclass这个TableView,用于接受拖拽,同时将TableView的delegate设置为Controller。将这个类WriteClass保存并添加至工程中。 接着选中TableView的第一列,将其绑定到Array Controller上。这样,ArrayController的任何变化,都将自动反应到这一列中。 实现在TableView中添加内容,增加一行文件的数据记录,只需要调用如下方法:
- (void) acceptFilenameDrag:(NSString *) filename
{
[filenames2 addObject:filename ] ;
NSString* disp = [ NSString stringWithFormat:@"拖拽测试%d", [filenames2 count] ] ;
[arrayControlleraddObject:disp]; }
要使View支持接受拖进文件,需要实现performDragOperation 方法的函数的代码如下:
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender
{
//实现文件的拖进到程序
int i;
NSPasteboard*pboard;
pboard =[sender draggingPasteboard];
if([[pboard types] containsObject:NSFilenamesPboardType])
{
iddelegate = [self delegate];
NSArray*filenames = [pboard propertyListForType:NSFilenamesPboardType];
if([delegate respondsToSelector:@selector(acceptFilenameDrag:)])
{
for(i=0;i<[filenames count];i++)
{
[delegateperformSelector:@selector(acceptFilenameDrag:) withObject:[filenamesobjectAtIndex:i]];
}
}
returnYES;
}
returnNO; }
要使View支持拽出文件,需要实现如下代码:
- (BOOL)tableView:(NSTableView *)tableView
writeRowsWithIndexes:(NSIndexSet *)rowIndexes
toPasteboard:(NSPasteboard *)pboard
{
//实现文件从程序拽出,通过剪贴板实现
NSUInteger i = 0 ;
NSMutableArray *files = [ [[NSMutableArray alloc] init] autorelease ];
for( i =[rowIndexes firstIndex ] ; i <= [rowIndexes lastIndex ] && i<[filenames2 count] ; i ++ )
{
[files addObject:[filenames2 objectAtIndex:i] ];
}
[pboarddeclareTypes:[NSArray arrayWithObjects: NSFilenamesPboardType,nil] owner:nil]; [pboardsetPropertyList:files forType:NSFilenamesPboardType];
returnYES; }
最佳实践:
本案例重点介绍了粘贴板的使用,通过研究本案例可以掌握NSTableView、绑定以及剪贴板的简单使用方法。拖拽功能在QQ,音乐播放器等软件中都有具体的应用,掌握该技术对于具体项目实践有重要意义。
相关文章推荐
- http协议8---响应信息头案例三(content-Type作用,实现发送一个文件(html,XML,image))
- python学习之路之案例1(修改haproxy的配置文件,并实现下线、上线的功能)
- 用VB和SQL Server实现文件上传(方案例)
- Ajax实现无刷新上传文件小案例
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- springmvc文件上传下载简单实现案例(ssm框架使用)
- 使用NIO读取文件 Java实现案例
- 文件存储的实现-login登录案例1-内置存储
- PHP 文件编程综合案例-文件上传的实现
- jquery插件ajaxFileUpload实现异步上传文件案例
- response实现案例之实现文件下载
- [置顶] android实现的文件上传案例探讨
- asp.net文件上传带进度条实现案例(多种风格)
- jquery.form.js框架实现文件上传功能案例解析(springmvc)
- SFTP基于Key多进程批量并发上传文件实现案例(python)
- 关于C++读取Lua配置文件实现案例
- sed命令实现文件内容替换总结案例
- 文件存储的实现-login登录案例2-sdcard
- springmvc文件上传下载简单实现案例(ssm框架使用)
- JSP+Servlet实现文件上传及下载案例