UITableViewCell的UITextField子视图,获取单元格的indexPath

我已经添加了一个UITextField作为UITableViewCell的子视图。 然后我添加了一个targetselector以便我可以知道何时UIControlEventEditingChanged 。 这很好,但我想知道UITextField所在单元格的indexPath ,因为它可以添加到任意数量的单元格中。

这可能吗? 基本上我想find一个UITableViewCell的父视图。

调用该字段的[UIView superview]以获取它所在的单元格,然后调用单元格中的[UITableView indexPathForCell:]来获取索引path。

更新:在iOS 7上,您也需要在该视图上调用superview(额外的视图层); 这里是UITableView的一个类别,应该独立于iOS版本工作:

 @interface UITableView (MyCoolExtension) - (NSIndexPath *)indexPathForCellContainingView:(UIView *)view; @end @implementation UITableView (MyCoolExtension) - (NSIndexPath *)indexPathForCellContainingView:(UIView *)view { while (view != nil) { if ([view isKindOfClass:[UITableViewCell class]]) { return [self indexPathForCell:(UITableViewCell *)view]; } else { view = [view superview]; } } return nil; } @end 

而不是recursion地试图find超级视图,有一个更简单的解决scheme:

迅速

 func indexPathForCellContainingView(view: UIView, inTableView tableView:UITableView) -> NSIndexPath? { let viewCenterRelativeToTableview = tableView.convertPoint(CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds)), fromView:view) return tableView.indexPathForRowAtPoint(viewCenterRelativeToTableview) } 

Objective-C的

 - (NSIndexPath *)indexPathForCellContainingView:(UIView *)view inTableView:(UITableView *)tableView { CGPoint viewCenterRelativeToTableview = [tableView convertPoint:CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds)) fromView:view]; NSIndexPath *cellIndexPath = [tableView indexPathForRowAtPoint:viewCenterRelativeToTableview]; return cellIndexPath } 

我为了迅捷的心,把它变成了一个主旨

试试这个解决scheme 它为我工作

  #pragma mark - Get textfield indexpath - (NSIndexPath *)TextFieldIndexpath:(UITextField *)textField { CGPoint origin = textField.frame.origin; CGPoint point = [textField.superview convertPoint:origin toView:self.TblView]; NSIndexPath * indexPath = [self.TblView indexPathForRowAtPoint:point]; NSLog(@"Indexpath = %@", indexPath); return indexPath; } 

我想在swift中分享@Ertebolle代码 –

 extension UITableView { func indexPathForCellContainingView(view1:UIView?)->NSIndexPath? { var view = view1; while view != nil { if (view?.isKindOfClass(UITableViewCell) == true) { return self.indexPathForCell(view as! UITableViewCell)! } else { view = view?.superview; } } return nil } }