1

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

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

考虑 MVC 和干净的代码。

我应该只传入Match对象并让单元格做所有事情吗?还是公开单元格的不同元素(team1NameLabel、team1ScoreLabel、team2NameLabel 等)并将它们全部单独设置在UITableViewController?

第一种方法使UITableViewController清洁剂变得更清洁,但随后我依靠UITableViewCell“了解”Match班级,Team班级等...

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

4

3 回答 3

1

我会遵循以下规则:

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

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

于 2013-07-31T09:42:54.087 回答
1

MatchIMO 将对象传递给您的表格视图单元格更好,更类似于 MVC 。

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

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

于 2013-07-31T09:49:15.753 回答
1

两种方式都很好,但我个人会选择第二种选择,即公开@property 的表格视图,如果有必要,还可以使用网点。

但是,如果您真的想选择第一个选项,我建议将任何对象传递给单元以实现一个协议,该协议暴露了一些方法:

@protocol tableViewCellProtocol

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

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

[mytableCell renderObject:objectImplementingProtocol];

通过这种方式,您可以稍微解耦对象本身,并准备单元格以与其他对象重用。

于 2013-07-31T09:52:30.090 回答