メソッドtableView:indexPathForCell
を使用して、内部にあるUITableViewCell
のフレームサイズに基づいてUIWebView
のサイズを動的に変更できるカスタムデリゲートを実装しています。問題は、特定のセルのindexPathが何であるかを調べようとすると、tableView:indexPathForCell
がnil
を返すことです。
- (void)trialSummaryTableViewCell:(TrialSummaryTableViewCell *)cell shouldAssignHeight:(CGFloat)newHeight {
NSIndexPath *indexPath = [tableV indexPathForCell:cell];
NSLog(@"tableV: %@\ncell: %@\nindexPath: %@", tableV, cell, indexPath); //<--
// ...
}
ここで、tableV
はnil
を返しません。セルはnil
を返しませんが、indexPath
はnil
を返します。
何が悪いのですか?
編集:tableView:cellForRowAtIndexPath:
メソッドから-(void)trialSummaryTableViewCell
を呼び出しています
現時点ではセルが表示されていない可能性があります。この場合、tableView:indexPathForCellはnilを返します。 indexPathForRowAtPointを使用してこれを解決しました。このメソッドは、セルが表示されていない場合でも機能します。コード:
UITableViewCell *cell = textField.superview.superview;
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:cell.center];
[tableV indexPathForCell:cell]は、セルが表示されていない場合はnilを返します。
また、「cellForRowAtIndexPath」メソッドから「trialSummaryTableViewCell」を呼び出す場合、indexPathを「trialSummaryTableViewCell」メソッドにも簡単に渡すことができます。
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];