7

キャッシュを消去する方法について誰か提案がありますUITableViewCellか?

これらのセルを reuseIdentifier でキャッシュしたいと思います。ただし、テーブルの行の一部を削除または変更する必要がある場合があります。reloadData行が変更された後に呼び出すことを期待しています。

現在、dequeueReusableCellWithIdentifier常に以前からキャッシュされた (廃止された) エントリを返します。キャッシュが古く、パージする必要があることを示すにはどうすればよいですか?

4

8 に答える 8

7

そもそもなぜ細胞をパージしようとしているのかわからない。セルをデキューするたびに、表示する必要があるデータを再設定する必要があります。キャッシュにより、変更されないプロパティを毎回設定する必要がなくなります。ただし、セルが以前にキャッシュされていたとしても、表示されている実際のデータを設定する必要があります。

再利用識別子は、同じタイプのすべてのセルで同じである必要があることに注意してください。問題の行に基づいて識別子を計算するなど、ばかげたことをしている場合は、間違っています。

コードは次のようになります

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:識別子];
    もし (!セル) {
        // キャッシュされたセルがないため、ここで新しいセルを作成します
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
        // アクセサリやテキストの色など、そのようなすべてのセルが共有するプロパティを設定します
    }
    // この特定のセルにデータを設定します
    cell.textLabel.text = @"foo";
    セルを返します。
}

その例では、毎回セルのデータを常に設定しており、すべてのセルが同じ識別子を共有していることに注意してください。このパターンに従えば、古いデータはいずれにせよ上書きされるため、セルを「パージ」しようとする理由はまったくないはずです。複数の種類のセルがある場合、その場合は複数の識別子を使用したい場合がありますが、それでもセルの種類ごとに 1 つの識別子です。

于 2011-01-05T04:41:17.087 に答える
3
while ([tableView dequeueReusableCellWithIdentifier:@"reuseid"]) {}
于 2013-09-12T03:38:32.943 に答える
2

とても良い方法を見つけました。

.h で

//add this
int reloadCells;

.m

- (void)dumpCache {
    reloadCells = 0;
    [tableView reloadData];
}

-(void)tableView:(UITableView *)tableView cellForRowAtUndexPath:(NSIndexPath *)indexPath {
    static NSString *CellID = @"Cell"
    UITableViewCell *cell = [tableView dequeCellWithReuseIdentifier:CellID];
    if (cell == nil || reloadCells < 12) {
        cell = [[UITableViewCell alloc] initWithFormat:UITableViewCellStyleDefault reuseIdentifier:CellID];
        reloadCells ++;
    }
    cell.textLabel.text = @"My Cell";

return cell;
}
于 2012-08-08T03:54:21.510 に答える
1

私は今日似たようなことをしなければなりませんでした。画像のギャラリーがあり、ユーザーがそれらをすべて削除すると、ギャラリーは最後にキューに入れられたセルを取り除き、「ギャラリーが空」の画像に置き換える必要があります。削除ルーチンが完了すると、「パージ」フラグが YES に設定され、[tableView reloadData] が実行されます。cellForRowAtIndexPath のコードは次のようになります。

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

    NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier];
    if (purge) {
        cell = nil;
        purge = NO;
    }
    if (cell == nil) {
        //*** Do usual cell stuff
    }
    return cell
}
于 2012-10-26T17:39:32.943 に答える
0

まさか…とは全く違うアプローチをとってしまいました。UITableView キャッシュに依存する代わりに、独自のキャッシュを構築します。このようにして、いつ、何をパージするかを完全に制御できます。このようなもの...

与えられた:

NSMutableDictionary *_reusableCells;
_reusableCells = [NSMutableDictionary dictionary];

できます:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = @"whatever-you-need";

    UITableViewCell *cell = [_reusableCells objectForKey:cellIdentifier];

    if (cell == nil)
    {
        // create a new cell WITHOUT reuse-identifier !!
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
        // store it in my own cache
        [_reusableCells setObject:cell forKey:cellIdentifier];
        /* ...configure the cell... */
    }

    return cell;
}

と:

-(void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    [_reusableCells removeAllObjects];
}

これが役立つことを願っています。

于 2013-02-14T20:41:54.187 に答える
0

セルの以前の使用による古いデータは、メッセージで消去されますprepareForReuse。セルがデキューされると、このメッセージは から返される前にセルに送信されdequeueReusableCellWithIdentifier:ます。

于 2010-02-18T06:26:41.667 に答える