0

のときに条件付きブレークポイントがありindexPath.section == 3 && indexPath.row == 3ます。初めてブレークポイントがトリガーされ、実行したとき

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

indexPath.section == 0 && indexPath.row == 0セルはではなくのセルと同じセルnilです。これは私が期待するものです。セクション 3 の行数が 4 であることを確認しました。セルが ではないのはなぜnilですか?

4

3 に答える 3

0

UITableView は必ずしも最初の行から描画を開始するとは限りません。ある時点でビューのどの部分を描画する必要があるかに応じて、どこからでも描画を開始できます。

メソッドは1回dequeueReusableCellWithIdentifier:だけ戻りnilます。その後、以前に他の行に使用されていたセルが永遠に返されます。

互換性のないセルを含む行が 2 つある場合は、それぞれに異なる識別子が必要です。たとえば、場合によっては、各セクションの識別子が必要になる場合があります。

ポイントは、おそらくテキストが異なることを除けば、ほぼ同じように見える何千ものテーブルビュー行を描画している場合、単一のセルを作成してからテキストを変更し、他のすべて (フォント、アクセサリ ビューなど) をそのままにしておくことができるということです。それが通過してそれぞれを描くのと同じです。

于 2013-08-17T05:03:04.030 に答える
0

セルの再利用性を制限したい場合は、以下の回答に従ってください。ただし、メモリ管理に悪いことをここで言及したいと思います

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSString *CellIdentifier = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil)
    {
        cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

         /// Put your code here.
     }

      /// Put your code here.

    return cell;
}
于 2013-08-17T04:40:12.910 に答える
0

の代わりに[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:CELL_IDENTIFIER];

...

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CELL_IDENTIFIER forIndexPath:indexPath];

nilセルのチェックなし。

于 2013-08-17T15:10:44.113 に答える