79

我如何从一个单元格中获取indexPathUITableView

我搜索了堆栈溢出和谷歌,但所有信息都在其他方面。有没有办法访问superView/UITableView然后搜索单元格?

有关上下文的更多信息:我有两个类,一个被调用Cue,一个被调用CueTableCell(它是 的子类UITableViewCellCueTableCellCue(两个类都有指向彼此的指针)的视觉表示。Cue对象位于链表中,当用户执行某个命令时,需要选择CueTableCell下一个的视觉表示(the ) 。Cue因此,Cue该类调用列表select中 next 的方法,该方法从Cue检索并调用其,为此它需要的​​ 。UITableViewcellselectRowAtIndexPath:animated:scrollPosition:indexPathUITableViewCell

4

12 回答 12

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

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

单元不知道它的索引路径是什么。控制器应包含任何基于数据模型操作 UI 元素或基于 UI 交互修改数据的代码。(参见MVC。)

于 2013-03-29T21:46:08.893 回答
25

从你的 UITableViewCell 尝试这个:

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

编辑:似乎这不适用于 iOS 8.1.2 及更高版本。感谢克里斯普林斯指出。

于 2013-11-28T20:10:10.980 回答
11
  1. 在单元格的 .h 文件中放置一个弱 tableView 属性,例如:

    @property (weak,nonatomic)UITableView *tableView;

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

    cell.tableView = tableView;

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

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

于 2015-04-23T11:21:29.513 回答
11

你可以试试这个简单的技巧:

在你的UITableViewCell班级:

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

并根据您的cellForRowAtIndexPath方法:

...
[cell setMyCellIndex : indexPath.row]

现在,您可以在任何地方检索您的单元格索引

于 2015-10-06T11:20:58.127 回答
10

为了解决那些说“这是个坏主意”的人,就我而言,我对此的需要是我的按钮上有一个按钮UITableViewCell,当按下它时,它会转到另一个视图。由于这不是单元格本身的选择,[self.tableView indexPathForSelectedRow]因此不起作用。

这给我留下了两个选择:

  1. 将需要传递到视图中的对象存储在表格单元格本身中。虽然这可行,但它会破坏我的观点,NSFetchedResultsController因为我不想将所有对象都存储在内存中,特别是如果表很长。
  2. 使用索引路径从 fetch 控制器中检索项目。是的,我必须通过黑客来弄清楚这似乎很难看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我的真实代码确实从表格视图中访问了所有这些,但我给出了一个示例,说明为什么有人可能想直接在表格单元格中执行类似的操作。

于 2014-03-25T00:31:19.703 回答
7

为了迅速

let indexPath :NSIndexPath? = (self.superview.superview as! UITableView)?.indexPathForCell(self)
于 2016-06-02T10:23:35.787 回答
4

这个问题的答案实际上对我帮助很大。

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

sender我的情况下是 aUITableViewCell并且来自prepareForSegue方法。

我用这个是因为我没有TableViewController我有UITableView property outlet

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

希望这对任何人都有帮助!

于 2014-02-14T02:13:00.393 回答
4

在 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。

于 2017-11-06T11:02:42.533 回答
1

试试这个(只有当 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;
于 2015-08-09T08:58:41.860 回答
1

Swift 3.0 及以上版本-

如果需要从自定义单元格中获取索引路径-

if let tableView = self.superview as? UITableView{
    if let indexPath = tableView.indexPath(for: self){
        print("Indexpath acquired.")
    }else{
        print("Indexpath could not be acquired from tableview.")
    }
}else{
    print("Superview couldn't be cast as tableview")
}

一个好的做法是寻找失败的案例。

于 2021-02-20T18:15:12.900 回答
0

从你的 UITableViewCell 尝试这个:

NSIndexPath *indexPath = [(UITableView *)self.superview.superview indexPathForCell:self];
于 2015-05-26T09:59:57.643 回答
-1

斯威夫特 4.x

为了提供对我的手机的访问权限,我做了这样的事情:

我有 UIView 的扩展:

extension UIView {
    var parentViewController: UIViewController? {
        var parentResponder: UIResponder? = self
        while parentResponder != nil {
            parentResponder = parentResponder!.next
            if let viewController = parentResponder as? UIViewController {
                return viewController
            }
        }
        return nil
    }
}

然后..在我的单元格类中:

class SomeCell: UITableViewCell {

    func someMethod() {
        if let myViewController = self.parentViewController as? CarteleraTableViewController {
            let indexPath : IndexPath = (myViewController.tableView).indexPath(for: self)!
            print(indexPath)
        }
    }
}

这就是我的全部。

此致。

于 2018-08-03T17:06:33.583 回答