web-dev-qa-db-ja.com

tableView:indexPathForCellはnilを返します

メソッドtableView:indexPathForCellを使用して、内部にあるUITableViewCellのフレームサイズに基づいてUIWebViewのサイズを動的に変更できるカスタムデリゲートを実装しています。問題は、特定のセルのindexPathが何であるかを調べようとすると、tableView:indexPathForCellnilを返すことです。

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

ここで、tableVnilを返しません。セルはnilを返しませんが、indexPathnilを返します。

何が悪いのですか?

編集:tableView:cellForRowAtIndexPath:メソッドから-(void)trialSummaryTableViewCellを呼び出しています

38

現時点ではセルが表示されていない可能性があります。この場合、tableView:indexPathForCellはnilを返します。 indexPathForRowAtPointを使用してこれを解決しました。このメソッドは、セルが表示されていない場合でも機能します。コード:

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

[tableV indexPathForCell:cell]は、セルが表示されていない場合はnilを返します。

また、「cellForRowAtIndexPath」メソッドから「trialSummaryTableViewCell」を呼び出す場合、indexPathを「trialSummaryTableViewCell」メソッドにも簡単に渡すことができます。

13
Nandakumar R

Jorge Perezの回答が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];
4
Daniel