【问题标题】:What is the best design pattern for reusing a UITableView with many data sources?重用具有多个数据源的 UITableView 的最佳设计模式是什么?
【发布时间】:2014-12-14 08:29:52
【问题描述】:

我有一个 UITableViewController,它显示通过网络检索到的数据。我正在努力找出最好的设计模式是什么,以便我可以重用同一个表视图,但显示来自许多潜在数据源的数据。在我的情况下,我可能有超过 50 个完全不同的网络请求,它们将检索数据以放入此表视图中。我不想子类化并拥有 50 个不同的表视图,所有这些视图都只使用不同的网络请求方法。重用单个类但能够让表视图数据源从许多地方检索数据的最佳方式是什么?

【问题讨论】:

  • tableviewcell的设计是一样的,还是每个list都不一样?
  • 表格视图在每种情况下都具有相同的设计。想象一下,这是一张摆满新闻条目的表格。设计是相同的,但每个单元格中的数据会有所不同。那么在这种情况下,我可能会收到来自 50 个不同来源的新闻来填满表格。
  • 然后就可以使用同一个tableview了。更新数据源数组后,调用 [tableView reloadData] 方法,您的表将重新加载新数据。
  • 您想同时显示来自不同来源的项目吗?还是您将拥有 50 个不同的视图,其中每个视图仅显示来自单一来源的项目?是否所有项目都具有相同的属性,例如故事标题、日期、描述等?
  • @MikeTaverne 我的情况是你的问题的后者。我需要有 50 个不同的视图,每个视图显示不同的数据。所有项目都将具有相同的属性。

标签: ios objective-c uitableview design-patterns


【解决方案1】:

您是否要实际继承 UITableViewController 仅取决于您要显示的数据类型以及您是否需要为其自定义 UITableViewCells。

如果您不需要任何自定义,只想以简单的方式显示数据,则根本不需要子类UITableViewController

此外,您正在寻找的设计模式并不是真正需要的,因为UITableViewController 本身的设计方式非常灵活,您可以轻松地显示来自不同数据源的数据(这就是 UITableViewDataSource 协议的目的毕竟)。

如果你的 50 个数据源总是返回一个对象数组,你可以只实现 UITableViewController 的一个版本,让它灵活地从这些数据源中提取数据。然后你可以使用一个属性,例如

@property (nonatomic, strong) NSArray* data;

UITableViewController内。

然后,您可以在需要时使用 Web 服务接口执行不同类型的请求并提取适当的数据。然后,一旦新数据从 Web 服务返回,您可以将其分配给您的属性 data 并调用 [self.tableView reloadData] 这将导致 UITableView 重新填充 data 的新内容。

不确定这是否能完全解决您的问题,如果我没有完全正确地解决您的问题,请告诉我。也许您还需要更准确地说明您的问题,以便我可以提供更好的帮助:)

【讨论】:

  • 我绝对知道你在这里谈论的概念,但我的问题主要是针对你帖子的结尾。就我而言,我有一个包含不同项目的菜单系统。当您点击一个时,它将带您进入一个新视图,该视图具有这些表视图控制器之一,并将使用一组特定的数据进行实例化,比如说体育新闻。然后另一个菜单项将导致表格视图的不同实例,但带有喜剧新闻。在这种情况下如何重用表格视图,但更改实例化时需要显示的数据?
【解决方案2】:

在这种情况下,您绝对可以使用一个 UITableView。问题的根源在于将来自 50 个不同版本的服务器的数据转换为将在每个 UITableViewCell 中显示的数据类型(即模型)。

您需要执行以下操作:

  1. 找出将在单元格中显示的数据(即标题、描述、作者等)
  2. 创建一个自定义类/结构来保存这些数据(即NewsItem
  3. 根据服务器数据创建NewsItem对象。
  4. 填充您的数据源。
  5. 将您的模型属性与您的 UITableViewCell 匹配。
  6. 获得新数据时调用tableView.reloadData()

假设我发现我有标题、描述和作者,我可以创建这个结构:

struct NewsItem {
    var title: String
    var detail: String
    var author: String
}

作为与服务器交互的代码的一部分,我创建了对象:

var newsItem1 = NewsItem(title: "Swift's Amazing", detail: "Here we go into why Swift is....", author: "Dustin Hill")
news.append(newsItem1)

然后,在配置我的UITableViewCells 时,我执行以下操作:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let newsItem = news[indexPath.row]
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseId")
    cell.textLabel.text = "\(newsItem.title) by \(newsItem.author)"
    cell.detailTextLabel.text = newsItem.detail
    return cell
}

这样,您只有一种类型的对象可以显示在单元格中。关键是翻译您从服务器获得的内容并将它们存储在通用数据类型中(通过读取您的 cmets 来查找您正在寻找的内容)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多