如何从单元格获取UITableViewCell indexPath?
我如何,从一个单元格,在UITableView
获取其indexPath
?
我已经search了堆栈溢出和谷歌,但所有的信息是在相反的方向。 有没有办法访问superView
/ UITableView
,然后search单元格?
关于上下文的更多信息:我有两个类,一个叫做Cue
,另一个叫做CueTableCell
(它是UITableViewCell
一个子类) CueTableCell
是Cue
的可视化表示(两个类都有指向对方的指针)。 Cue
对象位于链表中,当用户执行某个命令时,需要select下一个Cue
的可视表示( CueTableCell
)。 所以Cue
类在列表中的下一个Cue
上调用select
方法,该方法从cell
检索UITableView
,并调用它的selectRowAtIndexPath:animated:scrollPosition:
它需要UITableViewCell
的indexPath
。
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
它有助于阅读文档 ,即使这被认为是有争议的(见下面的评论)。
小区没有业务知道它的索引path是什么。 控制器应该包含任何基于数据模型操作UI元素的代码,或者基于UI交互来修改数据的代码。 (请参阅MVC 。)
尝试从你的UITableViewCell:
NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: self];
编辑:似乎这不适用于iOS 8.1.2和更进一步。 感谢克里斯·普林斯指出。
-
把一个弱的tableView属性放在单元格的.h文件中,如:
@property (weak,nonatomic)UITableView *tableView;
-
在cellForRowAtIndex方法中分配属性,如:
cell.tableView = tableView;
-
现在,无论你需要单元格的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:
- 将需要传递的对象存储在表单元本身的视图中。 虽然这会起作用,但是它会打败我拥有
NSFetchedResultsController
的观点,因为我不想将所有对象存储在内存中,尤其是在表很长的情况下。 - 使用索引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。