Swift:使用协议将自定义行为添加到UITableViewCell

开箱即用的UITableViewCells相当有限。 少数几种标准样式提供的标签和图像视图不多。 如果您希望单元格包含自定义按钮和控件怎么办? 充其量,您可以挂钩到详细信息显示按钮,并且可能会覆盖它的外观,但这有点不合常规。 通常最好建立自己的子类并使用自己的子视图和按钮设计表视图。

这是一个好的开始。 现在,我们希望控制器挂接到这两个按钮上。 您可能很想在表视图数据源的单元格配置步骤中向每个按钮添加自定义目标操作对。 这很危险,原因有两个:

  1. 如果不小心,可能会在重用单元格时意外地多次添加目标操作对。
  2. 捕获单击了其按钮的单元格的索引路径并不容易(遍历视图层次结构以达到单元格本身有点草率,并且UIView的tag属性对于复杂的表视图不是理想的选择)

快速方法:协议

Apple将Swift描述为一种面向协议的语言,因此让我们尝试一种面向协议的解决方案!

为您的单元格类创建一个自定义的委托样式协议。 我叫我SwiftyTableViewCellDelegate。 对于委托样式协议,您希望委托的用户对委托对象具有弱引用。 由于弱引用只能在类上使用,因此我们的协议将必须声明“类”一致性。

为您要跟踪的每个操作添加一个委托方法。 在我的示例中,我有一个心形按钮和一个垃圾按钮。 我想知道何时点击这些按钮中的任何一个,所以我为它们中的每个创建了一个委托函数。

将委托属性添加到您的自定义单元格类。 使它变弱和可选。 然后,将按钮操作连接到单元格中的方法,以调用这些委托方法。 这可以在情节提要中完成。

整合我们的自定义代表

使您的UITableViewController符合您刚刚设置的协议。 另外,还要确保将单元的委托设置为控制器本身。

最终结果看上去与我们最初的基于目标动作的方法并没有太大不同,但是它解决了我们两个主要问题!

  1. 由于单元格只有一个委托,因此每次使用该单元格时,表视图控制器都可以将自己分配为该单元格的委托,并且没有过度监听的风险。
  2. 由于委托函数在sender参数中发送单元格本身,因此我们可以要求表视图非常有效地查找索引路径。

精彩!