本例带您实现一个简单的例子,这个例子并不能做太复杂的事情,您可以从Finder中拖拽任何文件到列表里,拖拽后,文件名将会添加在列表中。

您可以在这个例子里学习NSTableView、绑定以及剪贴板的简单使用方法。

 

首先在Interface Builder中拖进一个Table View,拖进一个Object改名为Controller,再拖进一个Array Controller。

在Controller里添加一个叫做arrayController的outlet,用菜单中的Write Class自动生成代码并添加至工程中,将arrayController从id类型改为ArrayController *。接着把这个outlet和Array Controller连接起来。

将Array Controller绑定至Controller,将Model Key Path改为filenames。

将Table View的类改名为DragDropTableView,我们要subclass这个TableView,用于接受拖拽,同时将Table View的delegate设置为Controller。将这个类Write Class保存并添加至工程中。

接着选中Table View的第一列,将其绑定到Array Controller上。这样,Array Controller的任何变化,都将自动反应到这一列中。

由于我们已经将要实现在Table View中添加内容,只需要调用如下方法:

 

 

- (void) acceptFilenameDrag:(NSString *) filename

{

[arrayController addObject:filename];

}

 

 

即可在列表中增加一行文件名。

 

要使View支持接受拖拽,在DragDropTableView.m中,需要实现以下操作:

 

首先在awakeFromNib里,需要打开接受拖拽。

 

 

[self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];

 

 

以及如下方法:

 

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender

{

int i;

NSPasteboard *pboard;

pboard = [sender draggingPasteboard];

if ([[pboard types] containsObject:NSFilenamesPboardType])

{

id delegate = [self delegate];

NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType];

if ([delegate respondsToSelector:@selector(acceptFilenameDrag:)])

{

for (i=0;i<[filenames count];i++)

{

[delegate performSelector:@selector(acceptFilenameDrag :) withObject:[filenames objectAtIndex:i]];

}

}

return YES;

}

return NO;

}

 

要参考详细实现方法,您可以下载本文例子。

 

例子下载

 

例子作者:Robbie Duncan