用NSArrayController结合Cocoa绑定实现TableView中数据自动排序
Cocoa的绑定机制是一个强大的工具,尤其对table填充和排序数据时特别有用。通过代码实现对table数据填充及排序时需要相当数量的代码量,而通过Cocoa绑定可以减少大部分的代码,不能说零代码,但是至少省事很多。这篇技术文档介绍如何通过Cocoa绑定实现对NSArrayController提供数据的tableview的行数据实现自动排序。
引言
在我们的例子中,首先创建了一个具有两列NSTableColumn的NATableView,这两列的数据绑定到名为“MyArray”的NSArrayController中。将NSArrayController的类设置为NSMutableDictionary,有两个键分别为lastname, firstname。每列NSTableColumn按照如下格式绑定:
列 | 绑定到 | Controller Key | Model Key Path |
---|---|---|---|
Last Name | “MyArray” | arrangedObjects | lastname |
First Name | “MyArray” | arrangedObjects | firstname |

当table第一次加载和显示时你可以告诉table view如何对数据进行排序,用如下代码可以实现table 初始化时以Last name排序。这段代码应当位于控制器对象中,该控制器中也要存在一个对tableview引用的Outlet对象,通常位于
awakeFromNib
方法中
[myTableView setSortDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"lastname" ascending:YES] autorelease]]];
此时用户可以通过在每列NSTableColumn标题处点击进行排序。
自动对tableview数据排序(Mac OS X 10.5之前)
当用户添加很多names到table中时,列表会出现未排序的情况,在向表中添加其他name时,应该如何保持正确的排序顺序?这就是绑定到NSArrayController的NSSortDescriptor对象派上用场的地方。
您需要将NSArrayController绑定到一组NSSortDescriptor对象上,这可以通过提供一个控制器对象执行一个方法来返回NSSortDescriptor对象的NSArray来实现。
返回NSSortDescriptors的控制器对象
@implementation MyControllerObject
- (NSArray *)sortDescriptors
{
return [myTableView sortDescriptors];
}
//...
@end
然后,可以绑定NSArrayController到“MyControllerObject”,Model Key Path = sortDescriptors.
即使已经绑定了该关系,插入新数据仍然不会自动排序。在列头标题箭头显示已经排序的情况下会导致我们陷入困惑,为什么会这样呢?我们已经把排序完全交给了数组控制器,有一个好办法就是告诉控制器通知并调用rearrangeObjects。
下面示例如何给NSArrayController添加一个新的name
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"Sally", @"firstname",
@"Sixpack", @"lastname",
nil];
[myArrayController addObject: dict];
[myArrayController rearrangeObjects];
Mac OS X 10.5的改进
感谢在10.5版本中对NSArrayController加入了”Auto Rearrange Objects”属性,Mac OS X 10.5以后不再需要调用以下方法来自动排序数据:
可以通过以下任一方法使用”Auto Rearrange Objects”特性实现tableview数据排序:
- 在NSArrayController的xib属性中设置”Auto Rearrange Objects”勾选框为选中状态。
- 代码中调用[myArrayController setAutomaticallyRearrangesObjects:YES];
此时,给array controller 中添加name时将会进行自动排序。