2

UITableViewをスクロールするときになぜcellForRowAtIndexPath関数が呼び出されるのだろうか。すべてのスクロールセル構成コードが再度実行されることを意味しますか?テーブルをスクロールするときに速度が低下する問題があります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CountryCell";


UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

// Configure the cell...
NSString *continent = [self tableView:tableView titleForHeaderInSection:indexPath.section];
NSString *country = [[self.countries valueForKey:continent] objectAtIndex:indexPath.row];

cell.textLabel.text = country;

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

return cell;
}
4

4 に答える 4

3

他の人が言ったように、はい、各新しいセルが画面にスクロールしようcellForRowAtIndexPathとすると、セルごとに呼び出されます。これはパフォーマンスに影響を与える可能性がありますが、別の方法 (iOS が事前にすべてのセルを作成する方法) の方が悪い場合があります。ユーザーには表示されない可能性があります。とにかく、 のジャストインタイムの性質は、cellForRowAtIndexPath初期のパフォーマンス ヒットの点でも、小型のモバイル デバイスでの貴重なメモリ消費の点でも、おそらくより効率的です。

パフォーマンスの低下に関しては、ここには原因となるものは何もありません。私たちの多くは、cellForRowAtIndexPathはるかに複雑な方法を使用しており、速度は問題になりません。valueForKey何百万ものルックアップを行っている場合は、ルックアップに代わるより効率的な代替手段があるかもしれませんが、1 つのセルの違いは人間の目にはわかりません。他の場所を探す必要があると思います。何かtitleForHeaderInSectionおかしなことをしていませんか (つまり、配列内の値を検索するだけの別のこと)? 多分あなたは私たちとそれを共有することができます. 多分UIの何か。プロファイラーの「時間プロファイラー」でこれを実行する必要があるかもしれません。何かが突き出るかもしれません。しかし、cellForRowAtIndexPathこのシンプルさにより、完全にスムーズなユーザー エクスペリエンスが得られるはずです。

于 2012-07-05T05:13:11.840 に答える
2

テーブルをスクロールすると、消えたセルは破棄され、表示されるセルは を使用して作成および構成する必要がありますcellForRowAtIndexPath

より適切に言えば、セルは破棄されず、再利用可能なセルのキューに移動され、新しいセルは作成されません。再利用可能なセルはキューから取得され、再構成されます。

于 2012-07-04T09:01:57.740 に答える
1

テーブルをスクロールするときに cellForRowAtIndexPath が呼び出されるのは正しいです。まさにそのためです。スクロール中に新しいセルが表示されるたびに、UITableViewCell インスタンスを作成または再利用してから構成する必要があります。

速度低下は、通常、構成フェーズで負荷の高い操作を実行することによって発生します。あなたの場合、潜在的に遅い操作は国の検索です。

于 2012-07-04T09:04:16.100 に答える
1

このメソッドcellForRowAtIndexPathは、UITableView のすべての行に対して呼び出されます。行が表示ビューから消えると、そのメモリがクリアされ、新しいメモリが割り当てられるために新しいセルが表示されます (または古いセルが再割り当てされる可能性があります)。メソッドを使用して新しいセルが構成されますcellForRowAtIndexPath

このメソッドからわかるのは、この特定のセルに対して何を構成する必要があるかということだけです。

重い操作を実行している各セルが原因である可能性があります。

于 2012-07-04T09:04:55.310 に答える