Подзаголовок UITextField для UITableViewCell, получить индексную ячейку ячейки

Я добавил UITextField как подпункт UITableViewCell. Затем я добавил target и selector, чтобы я мог знать, когда UIControlEventEditingChanged. Это отлично работает, но я бы хотел, чтобы вы знали indexPath ячейки, в которой находится UITextField, поскольку она может быть добавлена ​​в любое количество ячеек.

Возможно ли это? В принципе, я хочу найти родительский вид, который является UITableViewCell.

Ответ 1

Вызовите [UIView superview] в поле, чтобы получить ячейку, в которой он находится, затем вызовите [UITableView indexPathForCell:] в ячейке, чтобы получить индексный путь.

UPDATE: на iOS 7 вам нужно также вызвать супервизор на этом представлении (дополнительный уровень просмотров); здесь категория в 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

Ответ 2

Вместо того, чтобы рекурсивно пытаться найти супервизор, существует более простое решение:

Swift

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
}

Я сделал это в Gist для горячего сердца

Ответ 3

Попробуйте это решение. Это сработало для меня

   #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;
}

Ответ 4

Я хотел бы поделиться кодом @Ertebolle в swift -

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
    }
}