您的位置:首页 > 移动开发 > Objective-C

案例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,音乐播放器等软件中都有具体的应用,掌握该技术对于具体项目实践有重要意义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐