将选择从UITableViewCell传播到UITableView委托

时间:2014-09-13 17:46:19

标签: ios objective-c uitableview

我正在为UITableViewCell创建子类并为其添加手势识别器。其中一个手势识别器附加到单元格内容视图的子视图,并且只有当用户点击此子视图时才应该“选择”该单元。我希望单元格将此选择传播到其包含的表视图,以便调用–[id<UITableViewDelegate> tableView:didSelectRowAtIndexPath:]方法。

几个问题:

  • 从UITableViewCell子类内部,我不知道我所处的索引路径(除非绝对必要,否则我不想将其存储为属性)。
  • 从UITableViewCell子类内部,我没有对UITableView和UITableViewDelegate的引用。 (同样,我希望避免明确声明这些。)
  • 我不想创建自己的委托来检测选择事件,我想使用内置机制(即didSelectRowAtIndexPath:如果可能的话)。
  • 如果我尝试使用天真的方法并在我的子类上调用self.selected = YES,则单元格会突出显示,但不调用委托的didSelectRowAtIndexPath。

换句话说,有没有办法从我自己的自定义代码中利用Apple的didSelectRowAtIndexPath:

1 个答案:

答案 0 :(得分:1)

正确的解决方案是创建自己的表格单元委托协议(尽管你说你不想要那样)。

然后您的表视图控制器可以是委托。然后表视图控制器可以查找单元格的indexPath并调用didSelectRowAtIndexPath委托方法。

这样做的好处是,您的自定义单元格并不关心事件的处理方式。它只是告诉其代表发生了什么事。该单元格不需要任何关于其表或indexPath的知识。

您的视图控制器可以链接您所需的功能。这是应该怎么做的。清洁职责分离。

另一件需要考虑的事情是tableView:didSelectRowAtIndexPath:的实现和自定义单元的委托方法的实现应该分别调用处理相同逻辑的共享方法。这比让一个委托方法直接调用另一个委托方法更有意义。