分类: 其他平台
2013-02-21 00:51:27
本例带您实现一个简单的例子,这个例子并不能做太复杂的事情,您可以从 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 Control ler 的任何变化,都将自动反应到这一列中。
由于我们已经将要实现在 Table View 中添加内容,只需要调用如下方法:
- (void) acceptFilenameDrag:(NSString *) filename {
[arrayController addObject:filename]; }
即可在列表中增加一行文件名。
要使 View 支持接受拖拽,在 DragDropTableView.m 中,需要实现以下操作:
首先在 awakeFromNib 里,需要打开接受拖拽。
[self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]]; 以及如下方法:
- (BOOL)performDragOperation:(id
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 ames objectAtIndex:i]];
}
}
return YES;
}
return NO;
}