UITableViewCell的UITextField子视图,获取单元格的indexPath
我已经添加了一个UITextField
作为UITableViewCell
的子视图。 然后我添加了一个target
和selector
以便我可以知道何时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 } }