使用filterPredicate计算NSArrayController中某些记录的行数

时间:2011-03-16 00:29:02

标签: objective-c cocoa core-data nsarraycontroller

我有一个简单的应用程序,它将NSTableView绑定到核心数据支持的NSArrayController。

应用程序在表视图中显示核心数据存储中的所有记录。

我定义了一些用户可设置的过滤器,它们在NSArrayController上设置过滤谓词。这些操作可以过滤具有标志集

的OUT记录

我希望有一个仪表板,列出核心数据存储中记录的元数据,例如:

记录总数
字段激活的记录数= Y
字段激活的记录数= N
字段更新= Y

的记录数

我希望这些信息是根据商店的内容计算的,而不是NSTableView的可见内容。

我遇到的问题是NSArrayController的arrangeObjects值受到过滤器应用程序的影响,因此当打开过滤器时,总记录数等内容会发生变化。

我已经搜索了很多并查看了我的各种编码书,但我无法弄清楚如何以允许我将它们绑定到IB中NSTextField的值的方式计算这些值。

非常感谢任何帮助或建议。

此致

达伦。

3 个答案:

答案 0 :(得分:0)

为什么不创建另一个直接从Core Data堆栈计算这些值的控制器对象,并以符合KVO的方式公开它们?

答案 1 :(得分:0)

首先对您的控制器进行子类化,在本例中为NSArrayController。其次,在控制器上创建表示所需值的属性,例如:

@property(nonAtomic,retain)NSNumber * fieldActiveYes; @property(nonAtomic,retain)NSNumber * fieldActiveNo; @property(nonAtomic,retain)NSNumber * fieldChanged;

接下来,为每个属性创建一个自定义getter:

-(NSNumber *) fieldActiveYes{
    // ... perform a fetch by value on the field you wish
   //... set the fetch to return dictionaries only
   // ... use @sum collection operator to sum the fields
   return sum;
}

将UI字段的值绑定到控制器fieldActiveYes键。当managedObjectContext更改时,它应该重新计算。如果没有,您可能需要添加一些观察。

答案 2 :(得分:0)

感谢您的回复。

最后我发现这是最简单的解决方案:

我在IB中创建了额外的NSArrayControllers(每个文本域一个),并将每个文本域的managedObjectContext绑定到主moc。

我将AC设置为实体模式,然后将每个AC的FetchPredicate设置为相关的条件。

在我的UI中,我然后将每个文本字段绑定到相关新AC的arrangeObjects @count。

此致

达伦。