用NSArrayController结合Cocoa绑定实现TableView中数据自动排序

用NSArrayController结合Cocoa绑定实现TableView中数据自动排序

Cocoa的绑定机制是一个强大的工具,尤其对table填充和排序数据时特别有用。通过代码实现对table数据填充及排序时需要相当数量的代码量,而通过Cocoa绑定可以减少大部分的代码,不能说零代码,但是至少省事很多。这篇技术文档介绍如何通过Cocoa绑定实现对NSArrayController提供数据的tableview的行数据实现自动排序。

引言

在我们的例子中,首先创建了一个具有两列NSTableColumn的NATableView,这两列的数据绑定到名为“MyArray”的NSArrayController中。将NSArrayController的类设置为NSMutableDictionary,有两个键分别为lastname, firstname。每列NSTableColumn按照如下格式绑定:

绑定到Controller KeyModel Key Path
Last Name“MyArray”arrangedObjectslastname
First Name“MyArray”arrangedObjectsfirstname

![FAC01530-1112-49FA-B56C-587647D601AA](/Users/mac123/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/819954692/QQ/Temp.db/FAC01530-1112-49FA-B56C-587647D601AA.png)

当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。

[myArrayController 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以后不再需要调用以下方法来自动排序数据:

[myArrayController rearrangeObjects];

可以通过以下任一方法使用”Auto Rearrange Objects”特性实现tableview数据排序:

  • 在NSArrayController的xib属性中设置”Auto Rearrange Objects”勾选框为选中状态。
  • 代码中调用[myArrayController setAutomaticallyRearrangesObjects:YES];

此时,给array controller 中添加name时将会进行自动排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值