让我们做得更好:UITableViewCell

每个iOS开发人员都会创建UITableViewCells,但让我们做得更好。
根据我的实践,这里有五个原则。

TL; DR

  1. 在自己的小腿上做;
  2. 将用户界面设为私有;
  3. 不要配置模型;
  4. 让他们暗恋;
  5. 重用之前重设。

完整示例应用程序的源代码: https : //github.com/alekseishirokov/medium-01-better-uitableviewcell

每次在情节提要中创建新的UITableViewController时,XCode都会创建一个空单元格原型。 这导致开发人员使用此模板将UI元素直接放置到此单元格视图中。

但这是一个坏习惯。 迟早,您的项目经理会要求您使用完全相同的单元格设计,但要使用另一个表。
当他们告诉我不仅要在人员的详细信息视图中还必须在部门的详细信息视图中显示文档列表时,我已经摆脱了这种行为。 我文档的单元格原型包含10个UILabel,2个UIImageViews和一堆棘手的约束。 尽管XCode具有复制粘贴命令,但这并不容易。

让我们做得更好:在自己的xib文件中创建UITableViewCell并在所需的任何表中重复使用。

这很容易做到。 按Cmd + N创建一个新文件。 然后选择iOSCocoa Touch Class 。 然后在下拉菜单的子类中选择UITableViewCell ,输入类名,并选中“ 同时创建XIB文件”复选框。

XCode创建两个文件: DocumentTableViewCell.swiftDocumentTableViewCell.xib

使用xib文件将UI元素放入单元格视图中。 使用swift文件将IBOutlet与这些UI元素绑定。

然后,您可以在表视图控制器中使用此DocumentTableViewCell ,如下所示:

这意味着我需要重构每个使用我的DocumentTableViewCell的表视图控制器,如下所示:

如今,我做得更好。 我将UI出口声明为单元格视图专用。 我仅使用configure方法将数据传递给UI元素:

在表视图控制器中,您只需将文档的优先级作为参数传递给configure方法。

直觉是, 优先级是数据,取决于单元格视图如何显示数据。

同样,在单元设计发生更改的情况下,也无需重构表视图控制器。

即使在教程中,也通常通过将模型对象传递给configure方法来用数据填充单元格:

这似乎是一个优雅的解决方案,但事实并非如此。 这会将单元格的视图与模型对象耦合在一起。 单元格视图取决于模型对象的结构。 但是,我们坚持的MVC模式就是将视图和模型分离。

我倾向于将数据作为单独的参数传递给configure方法:

它使我可以在另一个表中重用单元格视图,而不管我将在那里使用什么数据对象。

单元格视图设计人员无需了解数据模型。

另外,在声明configure方法时,我可以严格指定哪些数据是可选的,以及哪些数据才能正确显示单元格视图。

看,“数字”是可选的。

您可能会注意到,作为Int的 优先级仍然与模型结合在一起。 还有一个问题:如果优先级的值为4,该怎么办? 为了解决这种不确定性,让我们介绍一个优先级枚举。 在表视图单元格类中声明它,因为它引用了一个视图:

这样,您可以严格限制优先级值的范围。 这使配置功能更加强大和安全:

但是您需要在表视图控制器中做一些额外的工作。 创建一个私有函数优先级(从:),该函数将整数值转换为枚举值。 此后,单元格视图和模型是完全独立的。

有时我会像这样看到单元格的创建:

请注意,如果dequeueReusableCell返回值不是DocumentTableViewCell类型,则我们将静默创建DocumentTableViewCell实例。

让我们做得更好:使用强制展开。

这不仅要编写代码,而且如果重用标识符与预期的单元格类型不对应,也会因错误而崩溃。 这次崩溃很好。
我的意见是
dequeueReusableCell无法创建预期类型的​​单元格,这意味着我的应用程序设计有问题。 我想在开发阶段尽快知道这一点。

如果由于某种原因您不遵循“将它们设为私有”的原则,则需要在单元格视图类中创建一个reset方法,该方法将所有UI元素设置为默认状态。

然后,在dequeueReusableCell方法之后但在为UI元素设置任何值之前,在表视图控制器中调用此方法。

调用reset方法可防止在单元重用时UI元素被未初始化或保留在先前的值中。

注意:但是,如果您遵循前面提到的所有原则:将UI元素声明为私有,仅通过configure方法设置它们,然后configure方法设置单元格的所有UI元素,则可以省略reset方法。

  1. 在自己的小腿上做;
  2. 将用户界面设为私有;
  3. 不要配置模型;
  4. 让他们暗恋;
  5. 重用之前重设。