UITableViewCell配置实践

假设我们的足球俱乐部模型具有以下界面:

足球俱乐部数据模型

根据俱乐部的属性值,我们的业务逻辑应确定进度的颜色和相应的装饰文字(正,负或破折号)。

1.门面式单元

苹果公司提供的本机UITableViewCell正是这种样式。 它提供了3个公共访问器来呈现内容: textLabel , detailTextLabel, imageView 。 但是,通常,我们需要更多的UI元素和自定义。
因此,我们可以将子视图添加到单元格的内容视图中,也可以创建UITableViewCell的自定义子类并添加必要的公共属性:

外墙样式的单元头文件

因此,业务逻辑由其数据源在外部进行管理:

外墙样式单元格配置

用户选择将按照以下方式处理:

外墙样式的用户选择逻辑

外墙风格的优点:

  1. 本机样式(Apple提供的样式)。
  2. 简单灵活,将来可以支持。
  3. 单元从外部填充,对业务逻辑一无所知。

外墙样式的缺点:

  1. 所有访问器都是公共的,这提供了低级别的封装。
  2. 要确定选择哪个足球俱乐部用户,您必须在数据源中执行其他搜索操作。
  3. 在动态数据更改的情况下,对数据源的附加搜索似乎是不可靠的,并且对于数据源不是PODS(普通旧数据源😏)的情况则很复杂,即它包含许多不同的模型,部分并且具有不均匀的结构。

2. VIPER样式的单元

我想用这种方式命名这种样式,因为它具有VIPER拱形固有的一些功能。 Cell仅提供设置值的公共方法,所有访问器都封装在“ .m”文件中:

VIPER样式的单元公共API

在单元的实现中为访问器设置了相应的值。
从外面看起来像:

per蛇式电池配置

VIPER风格的优点:

  1. 最高级别的封装。
  2. 单元从外部填充,对业务逻辑一无所知。

VIPER风格的缺点:

1.对于具有大量UI元素的“超载”单元格,与fe Facade样式的单元格相比,您的头文件将是双倍大小的(要设置标签的字体,文本和文本颜色,您必须向VIPER添加3种单独的方法样式的单元格公共API)。 在这里,我只引用Robert C. Martin在他的“ Clean Code”一书中提到的第4个简单设计规则:

最小的类和方法。
高等级的方法有时是无意义的教条主义的结果​​。
…我们的目标是使整个系统保持较小,同时还要使函数和类保持较小。

2.由于它不存储指向模型的指针-您将必须通过在数据源中进行附加搜索来确定选择了哪个足球俱乐部用户。

3.通过复杂数据源进行其他搜索会降低将来对应用程序的支持的简便性。

3. MVVM样式的单元

这种风格的主要特点是:
1)使用ViewModel,它关心业务逻辑并用数据填充单元格;
2)根据常用的MVVM做法–最好使用Reactie方法进行数据更改和用户交互。
好吧……给我看代码😤!

单元格的ViewModel头文件
Cell的ViewModel实现文件

在ViewModel配置时,可以轻松处理足球俱乐部的选择:

单元格的ViewModel配置

请注意viewModel.command配置,该配置将在用户选择时触发,并将直接使用必要的clubModel,而完全不需要吸引数据源。

那细胞呢?

MVVM样式的单元的头文件
MVVM样式单元的实现

从现在开始,每按一次按钮,我们都会选择俱乐部以显示个人资料页面。

MVVM风格的优点:

  1. 高水平的数据封装。
  2. 单元从外部填充,对业务逻辑一无所知。
  3. ViewModel提供的应用程序业务逻辑。 这样可以防止大量视图控制器出现问题,并将逻辑分解为相互关联的小模块。
  4. 由于它使用反应性方法,因此无需在数据源中搜索选定的项目。

MVVM样式的缺点:

1.将来不容易获得支持(尤其是其他一些开发人员)。
2.可以应用于完全通过MVVM开发的项目(否则会破坏项目的架构一致性)。

4.独立式单元

通过设置特定的数据模型配置单元时非常常用的方法,并且在需要时可以轻松返回完全相同的源模型。 公开API很简单

独立样式的单元头

最主要的是实现,数据填充甚至业务逻辑:

独立样式的单元实现

独立风格的优点:

  1. 存取器封装。
  2. 避免在数据源中搜索选定项,因为它存储了指向源模型的指针,并且可以轻松地将选定项提供给委托。

独立风格的缺点:

  1. Cell保持业务逻辑并了解所有相关信息,这对于像cell这样的元素而言并不是一个好主意。 (请参阅:UITableViewCell不是控制器)。
  2. 对于未来的变化极为不灵活,尤其是在涉及复杂的业务逻辑行为方面。

我们了解开发中的最佳实践。 我深信“独立风格” 最糟糕的开发实践的 典范

5.相关模型的外观

这种方法可以从Facade样式Independent样式的单元中更改 。 它提供访问器作为公共访问器,并且完全从外部进行配置,但是它保持指向固定模型的指针,这可以避免通过用户操作搜索数据源。

具有相关模型公共API的外观

具有相关模型优点的外观:

1.本机苹果风格。
2.单元从外部填充,对业务逻辑一无所知。
3.无需在数据源中搜索所选模型,因为单元存储了相关模型并将其提供给委托人。
4.对于将来的更改非常灵活。

具有相关模型缺点的外观

  1. 所有访问器都是公共的,这提供了低级别的封装。

简短的摘要:

您的iOS应用可能会根据情况甚至您的心情而采用几种不同的方式来立即配置表格单元格。 每个都有各自的优缺点,因此请使用它们并记住,​​有一天您必须扩展其功能,重新设计或调试复杂的问题。

您最喜欢的配置UITableViewCell的方法是什么?
沙箱项目可在GitHub上使用