你如何过滤NSArray或NSMutableArray?

时间:2010-03-01 14:43:23

标签: cocoa macos

我想要一个NSArray或NSMutableArray,它总是显示数据集的过滤视图。也就是说,如果过滤器设置为“显示带字母a的东西”,并且添加了项目“blah”,则该项目将自动显示在列表中。但是,如果添加了“bluh”,它将不会显示在已过滤的列表中(但仍会存在于基础数据集中)。

我看到NSArray和NSMutableArray上有过滤方法,但这些是一次性方法。也就是说,当您调用方法时,过滤器会再次发生(当然,除非您再次调用过滤器方法)。

我来自Java世界,我是否曾广泛使用Glazed Lists来做这类事情。我希望在Cocoa中采用类似的解决方案。

2 个答案:

答案 0 :(得分:4)

你很可能想要按照Ole。

的建议使用NSArrayController

您可以按照建议使用setFilterPredicate:,然后您可以通过调用控制器上的arrangedObjects来访问对象。您不需要setAutomaticallyRearrangesObjects:,除非您打算对数据进行排序(使用排序描述符 - NSSortDescriptor实例)。

NSArrayController实际上设置为非常容易处理在表格视图中显示内容,因此如果这是您的最终目标,那么这正是您想要的。它与NSSearchField很好地集成,以处理UI中的谓词。

如果你使用它作为一些传递的后端对象,那么你可能想要自己写一些比NSArrayController重量轻的东西。

答案 1 :(得分:1)

来自iPhone,我对NSArrayController不是很熟悉,但你可能想看看它。在我看来,setFilterPredicate:setAutomaticallyRearrangesObjects:YES结合使用可能会成功。

除此之外,使用Key-Value Observing推出自己的解决方案应该非常容易。如上所述,从要过滤的数组的可变副本开始,并使用filterUsingPredicate:对其进行过滤,然后将自己注册为原始数组中插入和删除的观察者,并在调用observer方法时调用{ {1}}在新插入的对象上决定是否将它们插入过滤后的数组中。

相关问题