Подтвердить что ты не робот

Как получить UITableViewCell indexPath из Cell?

Как я могу, из ячейки, получить indexPath в UITableView?

Я искал вокруг и google, но вся информация находится на обратной стороне. Есть ли способ получить доступ к superView/UITableView, а затем выполнить поиск ячейки?

Дополнительная информация о контексте: есть два класса, которые я имею, один называется Cue, а один называется CueTableCell (который является подклассом UITableViewCell) CueTableCell является визуальным представлением Cue (оба класса имеют указатели друг на друга). Cue объекты находятся в связанном списке, и когда пользователь выполняет определенную команду, необходимо выбрать визуальное представление (CueTableCell) следующего Cue. Таким образом, класс Cue вызывает метод select в следующем Cue в списке, который извлекает UITableView из cell и вызывает его selectRowAtIndexPath:animated:scrollPosition:, для которого ему требуется indexPath UITableViewCell.

4b9b3361

Ответ 1

NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

Это помогает читать документацию UITableView, даже если это считается спорным (см. Комментарии ниже).

Ячейка не имеет бизнеса, зная, каков ее индексный путь. Контроллер должен содержать любой код, который манипулирует элементами пользовательского интерфейса на основе модели данных или изменяет данные на основе взаимодействий пользовательского интерфейса. (См. MVC.)

Ответ 2

Попробуйте использовать это из вашего UITableViewCell:

NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: self];

EDIT: Кажется, это не работает на iOS 8.1.2 и далее. Спасибо Крису Принсу за то, что он указал.

Ответ 3

Вы можете попробовать этот простой совет:

на вашем UITableViewCell классе:

@property NSInteger myCellIndex; //or add directly your indexPath 

и по вашему методу cellForRowAtIndexPath:

...
[cell setMyCellIndex : indexPath.row]

теперь вы можете получить индекс ячейки в любом месте

Ответ 4

  • Поместите слабое свойство tableView в файл ячейки .h, например:

    @property (weak,nonatomic)UITableView *tableView;

  • Назначьте свойство в методе cellForRowAtIndex, например:

    cell.tableView = tableView;

  • Теперь, где вам нужна индексная ячейка ячейки:

    NSIndexPath *indexPath = [cell.tableView indexPathForCell:cell];

Ответ 5

Чтобы обратиться к тем, кто говорит "это плохая идея", в моем случае моя потребность в этом заключается в том, что у меня есть кнопка на моем UITableViewCell, которая при нажатии представляет собой переход к другому представлению. Поскольку это не выбор в самой ячейке, [self.tableView indexPathForSelectedRow] не работает.

Это оставляет мне два варианта:

  • Сохраните объект, который мне нужно передать в представление в самой ячейке таблицы.. Хотя это будет работать, это приведет к победе над тем, что у меня есть NSFetchedResultsController, потому что я не хочу сохраняйте все объекты в памяти, особенно если таблица длинная.
  • Получить элемент из контроллера выборки с помощью указательного пути. Да, кажется уродливым, что мне нужно разобраться с NSIndexPath с помощью взлома, но это в конечном счете дешевле, чем хранение объектов в памяти.

indexPathForCell: - правильный метод для использования, но здесь, как я это сделал (предполагается, что этот код реализуется в подклассе UITableViewCell:

// uses the indexPathForCell to return the indexPath for itself
- (NSIndexPath *)getIndexPath {
    return [[self getTableView] indexPathForCell:self];
}

// retrieve the table view from self   
- (UITableView *)getTableView {
    // get the superview of this class, note the camel-case V to differentiate
    // from the class' superview property.
    UIView *superView = self.superview;

    /*
      check to see that *superView != nil* (if it is then we've walked up the
      entire chain of views without finding a UITableView object) and whether
      the superView is a UITableView.
    */
    while (superView && ![superView isKindOfClass:[UITableView class]]) {
        superView = superView.superview;
    }

    // if superView != nil, then it means we found the UITableView that contains
    // the cell.
    if (superView) {
        // cast the object and return
        return (UITableView *)superView;
    }

    // we did not find any UITableView
    return nil;
}

P.S. Мой реальный код имеет доступ ко всему этому из представления таблицы, но я приводил пример того, почему кто-то может захотеть сделать что-то подобное в ячейке таблицы напрямую.

Ответ 6

Для быстрого

let indexPath :NSIndexPath = (self.superview.superview as! UITableView).indexPathForCell(self)!

Ответ 7

Ответ на этот вопрос на самом деле мне очень помог.

Я использовал NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

sender в моем случае был UITableViewCell и исходит из метода prepareForSegue.

Я использовал это, потому что у не был TableViewController, но у меня был UITableView property outlet

Мне нужно было узнать название Cell и, следовательно, нужно было знать его indexPath.

Надеюсь, это поможет любому!

Ответ 8

В iOS 11.0 вы можете использовать UITableView.indexPathForRow(at point: CGPoint) -> IndexPath?:

if let indexPath = tableView.indexPathForRow(at: cell.center) {
    tableView.selectRow
    (at: indexPath, animated: true, scrollPosition: .middle)
}

Он получает центральную точку ячейки, а затем tableView возвращает indexPath, соответствующий этой точке.

Ответ 9

попробуйте это (оно работает только в том случае, если tableView имеет только один раздел и все ячейки имеют равную высоту):

//get current cell rectangle relative to its superview
CGRect r = [self convertRect:self.frame toView:self.superview];

//get cell index
int index = r.origin.y / r.size.height;

Ответ 10

Попробуйте использовать это из вашего UITableViewCell:

NSIndexPath *indexPath = [(UITableView *)self.superview.superview indexPathForCell:self];

Ответ 11

Swift 4.x

Чтобы обеспечить доступ к моей камере, я сделал что-то вроде этого:

У меня есть расширение UIView:

extension UIView {
    var parentViewController: UIViewController? {
        var parentResponder: UIResponder? = self
        while parentResponder != nil {
            parentResponder = parentResponder!.next
            if let viewController = parentResponder as? UIViewController {
                return viewController
            }
        }
        return nil
    }
}

А потом.. в моей камере Класс:

class SomeCell: UITableViewCell {

    func someMethod() {
        if let myViewController = self.parentViewController as? CarteleraTableViewController {
            let indexPath : IndexPath = (myViewController.tableView).indexPath(for: self)!
            print(indexPath)
        }
    }
}

Это все формирует меня.

С наилучшими пожеланиями.