将UITableView与许多数据源重用的最佳设计模式是什么?

时间:2014-12-14 08:29:53

标签: ios objective-c uitableview design-patterns

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

2 个答案:

答案 0 :(得分:0)

是否要实际创建子类UITableViewController仅取决于您要显示的数据类型以及是否需要为其定制UITableViewCell

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

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

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

UITableViewController

@property (nonatomic, strong) NSArray* data;

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

不确定这是否能完全解决您的问题,如果我的问题没有得到解决,请告诉我。也许你需要更精确地阐述你的问题,以便我能提供更好的帮助:)。

答案 1 :(得分:0)

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

您需要执行以下操作:

  1. 找出将在单元格中显示的数据(即标题,描述,作者等)
  2. 创建一个包含此数据的自定义类/结构(即NewsItem
  3. 根据服务器数据创建NewsItem个对象。
  4. 填充数据源。
  5. 将您的模型属性与UITableViewCell匹配。
  6. 获取新数据时调用tableView.reloadData()
  7. 所以,让我说我发现我有一个标题,描述和作者,我可以创建这个结构:

    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)
    

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

    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
    }
    

    这样,您只需要在单元格中显示一种类型的对象。关键是要从服务器翻译你得到的东西并将它们存储在通用数据类型中(从阅读你的评论是你正在寻找的)