如何知道UITableview行号

Jea*_*ott 38 iphone uitableview uiswitch ios

我有一个UITableViewCellUISwitch作为accessoryView的每一个细胞.当我更改单元格中交换机的值时,如何知道交换机在哪一行?我需要切换值更改事件中的行号.

jrt*_*ton 158

标签,子类或视图层次结构导航太多了!.在您的操作方法中执行此操作:

CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.tableView]; 
NSIndexPath *hitIndex = [self.tableView indexPathForRowAtPoint:hitPoint];
Run Code Online (Sandbox Code Playgroud)

适用于任何类型的视图,多节表,无论你可以抛出什么 - 只要你的发送者的起源在单元格的框架内(谢谢抢!),通常就是这种情况.

这里是UITableView Swift扩展:

extension UITableView {
    func indexPath(for view: UIView) -> IndexPath? {
        let location = view.convert(CGPoint.zero, to: self)
        return self.indexPathForRow(at: location)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @GajendraKChauhan - 就像它在你的行动方法中所说的那样.我的意思是当你的单元格中的按钮被轻敲时调用哪种方法,按钮本身作为"发送者"传递 (2认同)

rob*_*off 5

如果将tag属性设置为行号(如其他答案所示),则必须每次都更新它tableView:cellForRowAtIndexPath:(因为可以为不同的行重用单元格).

相反,当您需要行号时,您可以superviewUISwitch(或任何其他视图)向上走到UITableViewCell,然后到UITableView,并向表视图询问单元格的索引路径:

static NSIndexPath *indexPathForView(UIView *view) {
    while (view && ![view isKindOfClass:[UITableViewCell class]])
        view = view.superview;
    if (!view)
        return nil;
    UITableViewCell *cell = (UITableViewCell *)view;
    while (view && ![view isKindOfClass:[UITableView class]])
        view = view.superview;
    if (!view)
        return nil;
    UITableView *tableView = (UITableView *)view;
    return [tableView indexPathForCell:cell];
}
Run Code Online (Sandbox Code Playgroud)

这不需要任何东西tableView:cellForRowAtIndexPath:.