TableView / CollectionView单元格的索引

获取选定单元格的索引是一件容易的事,但是我已经看到很多实现都使用非常奇怪的方法来获取选择的实现,特别是在单元格具有许多按钮/动作来获取其索引的情况下。


让我们回到基础,如何获取选定单元格的索引?

通过简单地实现tableview / collection视图委托

  func collectionView(_ collectionView:UICollectionView,didSelectItemAt indexPath:IndexPath){}或:func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath){} 

这些是从用户那里进行选择的基本方法,但是如果我在单元格中只有一个按钮该怎么办? 我认为不必担心按钮,使其对触摸没有反应并让上述选择代表为您处理该按钮是不值得的!

但是,如果我想要该特定按钮怎么办? 如果我有多个按钮可以触发业务逻辑中的多个操作? 这就是处理视图中的触摸并将通知它的两种方法的地方:委托和闭包!

我自己发现,闭包是将视图连接到其父级的一种非常不好的方式,而且开发人员往往会忘记使用弱的或未使用的方式,以阻止两个类相互引用,从而容易导致内存泄漏。 因此,我相信代理人提供了更方便,更清晰的方式来轻松显示交互,更易于阅读,修复甚至通过您的应用进行通用。


要使用委托,人们会将indexPath作为变量发送到单元格,因此它知道它在其控制器内的位置,这是一个后果,因为现在视图知道的内容比其应了解的更多。 通过一个简单的函数调用就可以很容易地从管理它的集合/表视图中获取该信息:

  tableView.indexPath(for:UITableViewCell) 

因此,我们为此目的编写一个协议:通过用户交互通知控制器。

 协议TableViewCellDelegate:类{func didSelect(_ cell:UITableViewCell,_ button:UIButton)} 

集合怎么样?

 协议CollectionViewCellDelegate:类{func didSelect(_ cell:UICollectionViewCell,_ button:UIButton)} 

这个功能是您在不同单元格中所需的全部功能,现在它返回对单元格的引用以及在其中单击的按钮!

我们添加了类,因此可以在单元格中将其削弱:

 弱var委托:TableViewCellDelegate? 

将其添加到您的按钮操作中:

  @IBAction buttonTapped(_ sender:UIButton){委托?.didSelect(自己,sender) 
}

就是这样,现在使单元格委托引用您的控制器,并由您的控制器进行确认,现在您已经拥有所有选项卡并与表/集合单元格进行了交互!


 扩展UIViewController:TableViewCellDelegate {func didSelect(_ cell:UITableViewCell,_ button:UIButton){保护let index = tableView.indexPath(for:cell)else {return} let tag = button.tag}} 

在这里,我们确认它的viewController,获取索引,并获取按钮的标签以知道单击了哪个按钮,标签可以轻松地设置为0、1、2,具体取决于您单元格中有多少个按钮/动作。


现在就应该全部解决了,希望您能理解我的想法,这样您就可以通过应用使用较少混乱的协议,而通过您的应用执行相同的操作,如果您想对其他功能隐藏某些功能,也不要忘记使用协议扩展您可能需要指定其功能的控制器。

如果您有任何疑问,请在这里或在Twitter上与我联系,谢谢并祝您编码愉快!