2011-12-09 98 views
3

我正在查看Apple的TableSearch示例代码。看起来他们对于所有内容都有一个NSArray,对于过滤的内容有一个NSMutableArray。然后如果过滤器打开,那么它们将显示NSMutableArray。如果它关闭,他们会显示包含所有数据的NSArray。为UITableView筛选内容

1)我想知道这是否是过滤器的常见实现,因为我之前没有做过多的过滤。

2)若要添加到该问题,如果我有一个四个不同类别的过滤器,我仍然会使用一个NSMutableArray显示过滤器打开时的过滤内容?或者,我为每种不同类型的过滤器创建四个不同的NSMutableArrays,然后根据所使用的过滤器显示该列表。

假设通用实现是为列表提供一个NSArray,如果我要做四个不同的NSMutableArrays,或者根据点击从用户选择什么过滤器选项,我应该在飞行中创建NSMutableArray,然后重新加载[tableView reloadData];

谢谢。

回答

2

我没有在我面前的示例应用程序,但您通常会使用谓词进行过滤,因此您可以查看docs on NSPredicate将对您有所帮助。

所以,当你想改变过滤器,你通过改变谓词来做到这一点。您不必创建所有过滤的结果。您只能在任何特定时刻创建您需要的那个。

使用数组,您可以使用类似shown in this example的代码进行过滤。重点行是

NSPredicate *predicate; 
predicate = [NSPredicate predicateWithFormat:@"length == 9"]; 
NSArray *myArray2 = [myArray filteredArrayUsingPredicate:predicate]; 

过滤并不总是与数组完成。如果使用核心数据,则可以使用NSFetchedResultsControllers完成。在那里也使用谓词,非常相似。谓词还可以用于其他事物,包括正则表达式过滤。如果你不熟悉它,值得一看。

1

这真的取决于。如果您的基础数据在核心数据中,请使用NSFetchedResultsController并给它NSPredicate s。如果您有一组数据,则可能最容易遍历它并创建另一组数据。

通常,过滤器本身不可能像整个绘图过程(其中包括实例化或回收表格单元格)那样昂贵。您可以使用乐器轻松完成简介。

保持四个不同的数组在内存方面通常不是一个好主意,这是一种稀缺资源。

无论如何,reloadData都会涉及。 (根据操作系统版本,也许 - 请参阅NSFetchedResultsController文档。)