我有一个基于单元格的表格,通过数组控制器绑定到一个核心数据实体,其中包含一个日期字段和一个显示日期的列,所有这些都是在 InterfaceBuilder 中创建的,没有任何编码。我可以单击列标题以获取按日期排序的数据,而无需任何编码甚至任何进一步的绑定。对于基于视图的表,如何获得这种行为?我必须求助于一些编码吗?
日期显示在绑定到 Table Cell View 的文本字段中,键为 objectValue.date。
也许没有人在使用这些新奇的基于视图的表格,或者也许你们都一头雾水。三周后,我偶然发现了一个解决方案,不是完全无代码,它对我有用,所以我想我最好分享一下。
秘密是表的排序描述符绑定,您必须将其绑定到NSSortDescriptors数组。事后看来很明显。道德:试着理解锡上的内容!我天真地认为这是我可以定义排序描述符或绑定到某个可排序对象的地方,Interface Builder 是设计时的东西。当然没有任何效果。继续这个例子,这里是做什么。
声明一个数组属性。我在我的应用程序委托中做到了这一点。
@property (assign) NSArray *dateSorters;
并合成它。在 OS 10.7 中,您不需要匹配的 ivar。初始化它。我在applicationDidFinishLaunching:
dateSorters = [NSArray arrayWithObject:
[[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]];
那是唯一的活动代码行。现在是绑定。使用模型键路径dateSorters将您的数组控制器的排序描述符绑定到您的应用程序委托。如果它没有出现在可能的列表中,请尝试构建。该表现在将显示为已排序。要使单击列标题起作用,您必须将表的排序描述符绑定到同一个数组,并且必须将列与日期字段相关联:选择日期列,将其值绑定到数组控制器,排列对象与模型Key Path date,并检查Creates Sort Descriptor. 这与您对基于单元格的表格所做的相同。单击日期列标题现在可以切换排序顺序。按预期单击其他列标题不会执行任何操作。
剩下的一个小问题 - 在第一次出现时,该表未排序。
确保将表的排序描述符绑定到数组控制器的sortDescriptors
属性。
这有点晚了,但您不必编写任何代码行。相反,转到列的属性检查器,并将“排序键”字段设置为“日期”(不带引号)。选择器字段将自动设置为“比较”。
编辑:事实证明你甚至不必这样做。将表格列的值绑定到您希望对行进行排序的属性,就像对基于单元格的表格一样,就是这样。这样,您就不会将整个表格内容绑定到数组控制器的排列对象,这与 Apple 关于基于视图的表格的指南相矛盾。至少当我第一次创建和绑定基于单元格的表格时它对我有用,然后我将其转换为基于视图的表格(在属性检查器中,Xcode 4.5.2,OS X 10.7.5)。我尝试从基于视图的表开始,然后绑定列,但排序不起作用(这可能只是我做的一些错误)。