0

UITableView を作成しようとしています。ただし、私のテーブルの欠点は、スクロールすると(セルが非表示になってから再び表示されると)、タブがリセットされ、サーバーから画像が再度読み込まれることです。画像を読み込まないようにしたり、前のセルを保持したりするにはどうすればよいですか

static NSString *myIdentifier = @"myIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier];
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:myIdentifier];


    backImage =  [[UIImageView alloc] initWithFrame:CGRectMake(2, 4, 300, 62)];
    userDp    = [[UIImageView alloc] initWithFrame:CGRectMake(11, 10, 50, 50)];
    name            = [[UILabel alloc] initWithFrame:CGRectMake(67, 12, 176, 20)];

    name.font            = [UIFont fontWithName:@"HelveticaLTStd-Bold"   size:12];

CustomActivityViewer *imgIndicator = [[CustomActivityViewer alloc] initWithView:userDp];
[imgIndicator startAnimating];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{
    UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", IMAGE_URL, player.imagePath]]]];

    dispatch_async(dispatch_get_main_queue(), ^{
        [imgIndicator stopAnimating];
        if (img != nil)
            userDp.image = img;

        [imgIndicator stopAnimating];
    });
});

[name setShadowColor:[UIColor blackColor]];
[name setShadowOffset:CGSizeMake(1, 1)];
name.textColor = [UIColor colorWithRed:1.0 green:0.824 blue:0 alpha:1.0];

cell.accessoryType = UITableViewCellAccessoryNone;
[cell setSelectionStyle:UITableViewCellEditingStyleNone];
cell.backgroundColor = [UIColor clearColor];

[cell.contentView addSubview:backImage];
[cell.contentView addSubview:userDp];
[cell.contentView addSubview:name];

return cell;    

}

if (cell!= nil) を配置すると、セルが繰り返されます。

何をすべきか?

PS iPhone独自のチュートリアルの1つで、セルがnilでない場合、cell.contentViewがタグ付きのアイテムを設定し、タグ付きのビューを呼び出すようなものを見ました。そのチュートリアルが見つかりませんでした。知ってる人がいたら念のため

4

2 に答える 2

1

これはお勧めしませ:

テーブル内の行と同じ数のオブジェクトを含むセルの独自の配列を作成できます (作成しないでください)。次に、 cellForRowAtIndexPath で、適切なセルを再利用する代わりに単純に返すことができます。技術的には何も問題はありません。

2 握りのセルの場合、これで問題ありません。ただし、この概念は、テーブルが大きくなるとほぼ確実にメモリの問題につながります。

(非同期にロードされた)画像の配列を維持し、セルを適切に再利用して、 内の画像配列に戻すこともできますcellForRowAtIndexPath。ただし、セル ビューやサブビューなどのメモリを節約できるため、メモリの問題に関しては大きな変化はありませんが、通常は画像データ自体がかなりのメモリを消費します。

ユーザーやビジネス データなどに依存する可能性があり、制限できない行数が指定されていない場合、よりスマートなキャッシュ ソリューションに代わるものはありません。

于 2013-04-11T09:09:30.840 に答える
1

毎回画像をリロードしたくない場合は、画像をキャッシュするだけです。多くのオプションがありますが、そのうちの 1 つは NSCache またはSDWebImage です。

于 2013-04-11T08:43:02.930 に答える