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

TableView: indexPathForCell возвращает nil

Я использую метод tableView:indexPathForCell для реализации пользовательского делегата, который может динамически изменять размер UITableViewCell на основе размера фрейма UIWebView, который внутри него. Проблема в том, что tableView:indexPathForCell возвращает nil, когда я пытаюсь выяснить, что такое indexPath конкретной ячейки:

- (void)trialSummaryTableViewCell:(TrialSummaryTableViewCell *)cell shouldAssignHeight:(CGFloat)newHeight {
    NSIndexPath *indexPath = [tableV indexPathForCell:cell];
    NSLog(@"tableV: %@\ncell: %@\nindexPath: %@", tableV, cell, indexPath); //<-- 
    // ...
}

Здесь tableV не возвращает nil, ячейка не возвращает nil, но indexPath возвращает nil.

Что я делаю неправильно?

Изменить: я вызываю -(void)trialSummaryTableViewCell из метода tableView:cellForRowAtIndexPath:

4b9b3361

Ответ 1

Возможно, клетка в данный момент не видна. tableView: indexPathForCell возвращает нуль в этой ситуации. Я решил это с помощью indexPathForRowAtPoint, этот метод работает, даже если ячейка не видна. Код:

UITableViewCell *cell = textField.superview.superview;
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:cell.center];

Ответ 2

[tableV indexPathForCell: cell] возвращает nil, если ячейка не видна.

Также, если вы вызываете "trialSummaryTableViewCell" из метода cellForRowAtIndexPath, вы можете легко передать indexPath также методу "trialSummaryTableViewCell".

Ответ 3

Небольшое обновление, так как ответ Хорхе Переса не запускается с iOS7 (так как UIScrollView был вставлен, а вызов textField.superview.superview больше не будет работать).

Вы можете получить NSIndexPath следующим образом:

//find the UITableViewCell superview
UIView *cell = textField;
while (cell && ![cell isKindOfClass:[UITableViewCell class]])
    cell = cell.superview;

//use the UITableViewCell superview to get the NSIndexPath
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:cell.center];