我有一个自定义UITableViewCell
类,用于显示相当复杂的数据集。
基本上,单元格显示Match
个对象。但这样做会显示有关两个Teams
的信息,得分,经过的时间等等。
考虑MVC和清洁代码。
我是否应该传入Match
对象并让单元格执行所有操作?或者更好的做法是公开单元格的不同元素(team1NameLabel,team1ScoreLabel,team2NameLabel等等)并在UITableViewController
中单独设置它们?
第一种方式使UITableViewController
更清洁,但后来我依靠UITableViewCell
来“了解”Match
类,Team
类等。
第二种方式为UITableViewController
做了更多工作,但随后使UITableViewCell
显示为“哑”。它所做的就是在单元格内布置信息。它对它正在显示的信息一无所知。
答案 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];
这样,您可以稍微分离对象本身,并准备单元格以便与其他对象一起使用。