在UITableViewCell中显示复杂数据

时间:2013-07-31 09:31:51

标签: ios objective-c model-view-controller uitableview

我有一个自定义UITableViewCell类,用于显示相当复杂的数据集。

基本上,单元格显示Match个对象。但这样做会显示有关两个Teams的信息,得分,经过的时间等等。

考虑MVC和清洁代码。

我是否应该传入Match对象并让单元格执行所有操作?或者更好的做法是公开单元格的不同元素(team1NameLabel,team1ScoreLabel,team2NameLabel等等)并在UITableViewController中单独设置它们?

第一种方式使UITableViewController更清洁,但后来我依靠UITableViewCell来“了解”Match类,Team类等。

第二种方式为UITableViewController做了更多工作,但随后使UITableViewCell显示为“哑”。它所做的就是在单元格内布置信息。它对它正在显示的信息一无所知。

3 个答案:

答案 0 :(得分:1)

我会遵循这些规则:

  • 单元格应该只有用于显示各种数据位的插座。它是一个视图,所以它不应该包含任何逻辑。

  • 控制器应获取Match数据,解析并在必要时进行计算,并填充单元格。它是一个控制器,因此它是MVC上下文中的主要功能。

答案 1 :(得分:1)

IMO将Match对象传递给表视图单元格更好,更像MVC。

你在互联网上找到的很多代码(如果我记得很清楚,那就是Apple的例子)并没有这样做。您可以在tableView:cellForRowAtIndexPath:中调用的视图控制器中多次看到configureCell方法。

我更喜欢将模型对象对象传递给单元格,它使我的视图控制器代码更简单,并且单元测试更简单:当我测试我的视图控制器时,我只验证模型对象是否传递给单元格,然后在表格视图单元格测试中,我验证标签的测试是否设置为预期值。有人可能会说这让人了解模型,但我没有看到任何大问题。

答案 2 :(得分:1)

两种方式都很好,但我个人会选择第二种方式,即表格视图暴露@property,如有必要,还有出口。

但是,如果你真的想要第一个选项,我建议将任何对象传递给单元格以实现一个暴露少数方法的协议:

@protocol tableViewCellProtocol

    -(NSString*)titleForCell;
    -(NSString*)descriptionForCell;

然后你可以“传递协议”而不是对象。

[mytableCell renderObject:objectImplementingProtocol];

这样,您可以稍微分离对象本身,并准备单元格以便与其他对象一起使用。