UITextField подпредставление UITableViewCell, получить indexPath ячейки - PullRequest
8 голосов
/ 06 марта 2012

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

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

Ответы [ 5 ]

21 голосов
/ 06 марта 2012

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

ОБНОВЛЕНИЕ: в 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
11 голосов
/ 14 января 2015

Вместо рекурсивной попытки найти суперпредставление, есть более простое решение:

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
}

Я превратил это в Суть для Свифта Сердца

0 голосов
/ 03 апреля 2019

Свифт 4/5

func indexPathForCellContainingView(view: UIView,
                                    inTableView tableView:UITableView) -> IndexPath? {
    let viewCenterRelativeToTableview =
        tableView.convert(CGPoint(x: view.bounds.midX, y: view.bounds.midY), to: view)
    return tableView.indexPathForRow(at: viewCenterRelativeToTableview)
}
0 голосов
/ 25 июля 2016

Я хотел бы поделиться @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
    }
}
0 голосов
/ 05 июня 2015

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

   #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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...