iOS。 具有Swift泛型的通用单元

首先,我们必须承认在设计上不可能使用UITableViewCell而不是UICollectionViewCell,反之亦然。 因此,最好创建一些可以代替这两个类使用的东西。

UIView是一个很好的起点,因为它是UIKit中最通用的UI组件。 屏幕上显示的所有内容都可以使用它来创建。 我们可以将其放在表或集合单元中,作为其他所有内容的容器。 让我们从这个简单的想法开始。

第一次尝试

您可以看到其中具有任何视图的集合单元。

在这里以及我们进一步假设,很容易为表单元格创建相同的版本,并且省略了这种实现而不重复代码并减少读取时间的实现。

尽管单元格变得更加通用,但是这种方法给我们带来了一些缺点:

  • 我们失去了标准单元的重用,需要自己创建视图池。 这意味着使用UIKit库进行代码复制;
  • 使用xib更加困难,因为我们需要将所有内容都嵌入到视图中。
  • 有一个恒定的视图类型,因此我们每次使用视图时都需要强制转换类型。
  • 视图的框架严格限制为与单元格内容相同。

我们将使用Swift Generics对其进行进一步修复。

第二次尝试

作为第二种方法,我们对之前的代码进行了一些更改:

  • 首先,如果我们要使用系统的重用,则单元格内部的视图不应更改。 这意味着我们将该属性标记为常量,并在单元初始化期间创建一个视图。
  • 其次,让我们使用Swift Generics到处都知道视图类型。

现在看起来好多了。 但是我们仍然需要讨论有关从xib加载的大问题。

您通常需要一个xib名称,有时还需要一个束名称(对于框架而言)才能从xib加载某些内容。 如果xib与视图的类存储在同一束中,则xib名称足以加载视图,因为可以使用Bundle(for:Class)方法从该类接收束名称。

这是需要提供名称的协议LoadableFromXib ; 以及从xib文件加载视图的load方法的实现。

现在,在单元初始化期间从xib加载任何视图要容易得多。 看一下LoadableFromXibContentCollectionCell类中的视图初始化:

因此,现在我们可以使用任何视图创建集合(和表)单元,或者使用初始化程序创建它或从xib加载它。 系统对这些单元的重用( 任何视图)都是免费的。

最后,为了使解决方案更通用,让我们在视图中添加插图,因为单元已负责视图的定位和大小调整。 注意,在单元重用期间必须将内容插图恢复为零。

当然,可以向通用单元格添加更多属性,但是看起来contentInsets属性就足够了,因为通用单元格只负责在其内部定位视图。

总而言之,我们创建了具有以下功能的通用单元:

  1. 任何视图都可以轻松地转换为表单元格或集合单元,无论它是从xib加载还是以编程方式创建。 例如: SimpleContentCollectionCell -是包含标签的集合单元。
  2. 视图填充或边距不会发生变化,因为可以使用像这样的单元格的contentInsets参数来固定它们: cell.contentInsets.left = 20-从左侧增加20个点的插图。
  3. 在单元格上设置一些值时,我们确实知道该单元格的视图类型: cell.view.text =“单元格文本”

我已经发布了这篇文章,以分享一些Swift代码中的有用方法。 希望这会有所帮助。 此外,我们非常欢迎您评论和讨论该方法,并在您的项目中使用它。 另外,请随时下载游乐场以显示桌子高亮状态等:Universal Cells游乐场。

感谢您的阅读!