2013-02-27 20 views
0

我想换出一个tableview的内容。数据源具有带有标志的元素,表示是否应显示它们。如何仅在UITableView中显示数据源的子集?

最终,我希望能够交换显示的内容,具体取决于标志。不过,现在我会解决以下问题的答案。

我的表格如何只显示数据源的一个子集?

我是不是要求[tableView重载],这似乎是我的大多数搜索产生的。我只想根据标准(在本例中为标志)仅显示一些数据源项目。

作为一个清晰的例子,下面是一个功能样例。


我们在数组中有50个朋友元素。它是我们餐桌的数据源。当我们加载应用程序时,显示所有50个朋友。

其中20个朋友在Friend类中被标记为“Awesome”。当您点击真棒按钮时,这20个显示在表格中。

其中10个在Friend类中被标记为“Lame”。当您点击Lame按钮时,这10个显示在表格中。


我需要看什么方法才能实现这个目标? TableView的讨论非常庞大,迄今为止我一直在查看错误和错误,但没有取得令人满意的结果。

+1

总之,这不是直接可能的。使用给定答案的组合来完成它。 – Till 2013-02-27 01:32:14

+2

下面的答案解决了您的问题,但关键是您误解了“数据源”的含义。 tableview显示数据源提供的内容。这取决于数据源对数据进行过滤,排序,合并,转换或以其他方式处理数据到表格所需的格式。您正在将数据源与模型混淆。模型应该与数据源分开,并且数据源过滤,分类等从模型中检索的东西。 – 2013-02-27 01:34:05

+0

谢谢你,@RobNapier。这就说得通了;我从来不知道在整个数据源中MVC阈值是如此。 – Danny 2013-02-27 01:35:35

回答

3

保留两个数据结构。首先是主数据集。第二个包含你想要显示的数据。将表格指向第二组数据。

基本上,当你想用不同的子集重新加载表时,创建一个新的数组,迭代主数据集并添加你想要的对象到新数组。

即使第二个数组只是引用了来自主数组的原始对象,这对于此几乎没有额外的开销。

更新:为了扩大Rob Napier的评论,我提到的主数据结构将是“模型”,第二个数据结构将是支持表的数据源的数据。

+0

谢谢,这是有道理的,我想我知道如何实现它。 – Danny 2013-02-27 01:41:19

3

您可以设置一个NSPredicate筛选将由fetchResults返回值:

- (NSFetchedResultsController *)fetchedResults { 
... 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"flag == %@", @"Awesome"]; 
    [fetchRequest setPredicate:predicate]; 

... 

这只会返回那些符合NSPredicate的条件的记录。

+0

这不是特定于核心数据吗?没有迹象表明正在使用核心数据。 – rmaddy 2013-02-27 01:33:56

+0

是的,但NSPredicate的主体可以应用于任何数据源,而不仅仅是核心数据。 – 2013-02-27 01:35:36

+0

这对于过滤数据很有用,所以谢谢!我已经提出了你的答案。另一个人说实际在表格中显示过滤的数据,所以这是我正在标记的答案。 – Danny 2013-02-27 01:42:35