【问题标题】:How do I display only a subset of a datasource in a UITableView?如何在 UITableView 中仅显示数据源的子集?
【发布时间】:2013-02-12 16:47:27
【问题描述】:

我想换出 tableview 的内容。数据源的元素带有一个标志,表示是否应该显示它们。

最终,我希望能够根据标志交换显示的内容。不过,现在,我将确定以下问题的答案。

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

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

为了清楚起见,这里是一个功能示例。


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

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

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


我需要查看哪些方法来实现这一目标? TableView 的讨论非常广泛,到目前为止,我一直在寻找错误和错误,但没有令人满意的结果。

【问题讨论】:

  • 简而言之,这是不可能的。使用给定答案的组合来完成它。
  • 下面的答案解决了您的问题,但关键是您误解了“数据源”的含义。表格视图准确显示数据源提供的内容。数据源负责过滤、排序、合并、转换或以其他方式将数据处理成表格所需的形式。您将数据源与模型混淆了。模型应该与数据源分开,数据源过滤、排序等它从模型中检索到的东西。
  • 非常感谢@RobNapier。这就说得通了;我从来不知道 MVC 阈值是这样跨数据源绘制的。
  • 数据源的作用类似于微软使用的 MVVM 架构模式中的 ViewModel。有一些 Cocoa 开发人员研究 MVVM 的支持者;它可能比 MVC 更接近我们在实践中所做的事情(我还没有就 MVVM 做出决定;Big Nerd Ranch 提倡的 MVCS 架构可能更接近我通常做的事情)。

标签: ios uitableview datasource


【解决方案1】:

保留两个数据结构。第一个是主数据集。第二个仅包含您要显示的数据。将表格指向第二组数据。

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

由于第二个数组只引用了主数组中的原始对象,因此几乎没有额外的开销。

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

【讨论】:

  • 谢谢,这很有道理,我想我知道如何实现它。
【解决方案2】:

您可以设置NSPredicate 来过滤将由 fetchResults 返回的值:

- (NSFetchedResultsController *)fetchedResults {
...

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

...

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

【讨论】:

  • 这不是 Core Data 特有的吗?没有迹象表明正在使用 Core Data。
  • 是的,但是 NSPredicate 的主体可以应用于任何数据源,而不仅仅是核心数据。
  • 这对于过滤数据很有用,谢谢!我赞成你的回答。另一个是在表格中实际显示过滤后的数据,所以我将其标记为答案。
猜你喜欢
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 2013-12-11
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多