如何从单元格获取UITableViewCell indexPath?

我如何,从一个单元格,在UITableView获取其indexPath

我已经search了堆栈溢出和谷歌,但所有的信息是在相反的方向。 有没有办法访问superView / UITableView ,然后search单元格?

关于上下文的更多信息:我有两个类,一个叫做Cue ,另一个叫做CueTableCell (它是UITableViewCell一个子类) CueTableCellCue的可视化表示(两个类都有指向对方的指针)。 Cue对象位于链表中,当用户执行某个命令时,需要select下一个Cue的可视表示( CueTableCell )。 所以Cue类在列表中的下一个Cue上调用select方法,该方法从cell检索UITableView ,并调用它的selectRowAtIndexPath:animated:scrollPosition:它需要UITableViewCellindexPath

 NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 

它有助于阅读文档 ,即使这被认为是有争议的(见下面的评论)。

小区没有业务知道它的索引path是什么。 控制器应该包含任何基于数据模型操作UI元素的代码,或者基于UI交互来修改数据的代码。 (请参阅MVC 。)

尝试从你的UITableViewCell:

 NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: self]; 

编辑:似乎这不适用于iOS 8.1.2和更进一步。 感谢克里斯·普林斯指出。

  1. 把一个弱的tableView属性放在单元格的.h文件中,如:

    @property (weak,nonatomic)UITableView *tableView;

  2. 在cellForRowAtIndex方法中分配属性,如:

    cell.tableView = tableView;

  3. 现在,无论你需要单元格的indexPath:

    NSIndexPath *indexPath = [cell.tableView indexPathForCell:cell];

你可以试试这个简单的提示:

在你的UITableViewCell类上:

 @property NSInteger myCellIndex; //or add directly your indexPath 

和你的cellForRowAtIndexPath方法:

 ... [cell setMyCellIndex : indexPath.row] 

现在,您可以在任何地方检索您的细胞索引

为了解决那些说“这是一个坏主意”的人 ,在我的情况下,我需要的是我的UITableViewCell上有一个button,当按下时,它是另一个视图的延续。 由于这不是单元格本身的select, [self.tableView indexPathForSelectedRow]不起作用。

这给我两个select:

  1. 将需要传递的对象存储在表单元本身的视图中。 虽然这会起作用,但是它会打败我拥有NSFetchedResultsController的观点,因为我不想将所有对象存储在内存中,尤其是在表很长的情况下。
  2. 使用索引path从提取控制器中检索项目。 是的,我不得不通过黑客来弄清楚NSIndexPath ,但是这比在内存中存储对象要便宜得多。

indexPathForCell:是使用正确的方法,但这里是我如何做(假设这个代码是在UITableViewCell的子类中实现的:

 // uses the indexPathForCell to return the indexPath for itself - (NSIndexPath *)getIndexPath { return [[self getTableView] indexPathForCell:self]; } // retrieve the table view from self - (UITableView *)getTableView { // get the superview of this class, note the camel-case V to differentiate // from the class' superview property. UIView *superView = self.superview; /* check to see that *superView != nil* (if it is then we've walked up the entire chain of views without finding a UITableView object) and whether the superView is a UITableView. */ while (superView && ![superView isKindOfClass:[UITableView class]]) { superView = superView.superview; } // if superView != nil, then it means we found the UITableView that contains // the cell. if (superView) { // cast the object and return return (UITableView *)superView; } // we did not find any UITableView return nil; } 

PS我真正的代码不会从表格视图中访问所有这些,但我给出了一个例子,说明为什么有人可能想直接在表格单元格中这样做。

为了迅速

 let indexPath :NSIndexPath = (self.superview.superview as! UITableView).indexPathForCell(self)! 

这个问题的答案实际上帮了我很大的忙。

我使用NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

在我的情况下, sender是一个UITableViewCell并来自prepareForSegue方法。

我用这个,因为我没有一个TableViewController但我有UITableView property outlet

我需要找出Cell的标题,因此需要知道它的索引path。

希望这有助于任何人!

试试这个(它只适用于tableView只有一个部分,所有单元格具有相同的高度):

 //get current cell rectangle relative to its superview CGRect r = [self convertRect:self.frame toView:self.superview]; //get cell index int index = r.origin.y / r.size.height; 

尝试从你的UITableViewCell:

 NSIndexPath *indexPath = [(UITableView *)self.superview.superview indexPathForCell:self]; 

在iOS 11.0上,您可以使用UITableView.indexPathForRow(at point: CGPoint) -> IndexPath?

 if let indexPath = tableView.indexPathForRow(at: cell.center) { tableView.selectRow (at: indexPath, animated: true, scrollPosition: .middle) } 

它获取单元格的中心点,然后tableView返回对应于该点的indexPath。