本例带您实现一个简单的例子,这个例子并不能做太复杂的事情,您可以从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