0
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell * cell = [self.tableView cellForRowAtIndexPath:indexPath];
    return cell.bounds.size.height;
}

デメリットは何でしょう?

私はそれを変更しました

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell * cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    return cell.bounds.size.height;
}
4

2 に答える 2

2

通常、コードの最初のビットで行うように、テーブルからセルを取得する必要があります。しかし、この場合はできません。試行すると、 と の間で再帰呼び出しが発生cellForRowAtIndexPathheightForRowAtIndexPathます。

メソッドからセルを取得する必要がある場合はheightForRowAtIndexPath、テーブルにセルを要求してはなりません。

于 2012-12-04T03:54:17.837 に答える
2

rmaddy が指摘しているように、最初のバージョンを使用する-[UITableView cellForRowAtIndexPath:]と、テーブル ビューがtableView:heightForRowAtIndexPath:再度送信され、無限再帰が発生する可能性があるため、使用できません。

テーブルの各行に 1 つのセルが事前に割り当てられた静的なセルのセットを使用している場合は、2 番目のバージョンで問題ありません。

tableView:cellForRowAtIndexPath:行のセルを動的に作成している場合、自動解放されたオブジェクトを返すため、2 番目のバージョンではテーブル ビューの再利用キューが空になり、行ごとに別のセルが作成されます。これらのセルは実行ループが終了するまで割り当て解除されないため、これらのセルをすべて作成および破棄するための時間コストに加えて、テーブル内の行数に比例してメモリも使用します。そのようにしたい場合で、行数が多い場合は、明示的な自動解放プールを使用することをお勧めします。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    @autoreleasepool {
        UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
        return cell.bounds.size.height;
    }
}
于 2012-12-04T04:07:20.743 に答える