1

2 種類のセルを使用して TableView を実装してみます。最初の 1 つは、全幅の画像を内部に持つ上位のセルで、他のすべてのセルには左側に小さな親指の画像があります。

私の問題は、TableView のパフォーマンスです。たぶん 20 個の項目のリストをスクロールすると、少しぎくしゃくします。私はパフォーマンスを赤くしました。コードがそれほど悪くないことを願っています:

  1. 「パフォーマンスを上げるために画像のキャッシングは必要ない」そうですか?
  2. セルを正しい方法で再利用しますか。
  3. 2 種類のセルを使用するのは通常の方法ですか?

重要な部分は次のとおりです。

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0 && indexPath.row == 0) {
        return 160;
    }
    return 60;
}

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

    NSString *cellName = [[NSString alloc] init];

    // [...]

    if(indexPath.section == 0 && indexPath.row == 0){
        cellName = @"FirstMainCell";
        CellTemplateFirstNews *cell = [tableView dequeueReusableCellWithIdentifier:cellName];
        if(cell == nil){
            cell = [[[NSBundle mainBundle] loadNibNamed:@"CellTemplateFirstNewsView" owner:nil options:nil] objectAtIndex:0];
        }

        NSURL *urlRowImage = [NSURL URLWithString:[[NSString alloc]initWithFormat:@"http://webserver.de/inhalte/news/title/%@", detailDataNews.title_picture]];
        NSData *dataRowImage = [NSData dataWithContentsOfURL:urlRowImage];
        UIImageView *firstNewsImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 160)];
        firstNewsImageView.backgroundColor = [UIColor clearColor];
        firstNewsImageView.opaque = NO;
        firstNewsImageView.image = [UIImage imageWithData:dataRowImage];
        cell.backgroundView = firstNewsImageView;

        // [...]

        return cell;
    }else{
        cellName = @"MainCell";
        CellTemplateNews *cell = [tableView dequeueReusableCellWithIdentifier:cellName];
        if(cell == nil){
            cell = [[[NSBundle mainBundle] loadNibNamed:@"CellTemplateNewsView" owner:nil options:nil] objectAtIndex:0];
        }

        NSURL *urlRowImage = [NSURL URLWithString:[[NSString alloc]initWithFormat:@"http://webserver.de/inhalte/news/cover/%@", detailDataNews.cover_picture]];
        NSData *dataRowImage = [NSData dataWithContentsOfURL:urlRowImage];
        UIImage *rowImage = [UIImage imageWithData:dataRowImage];
        cell.thumbImage.image = rowImage;

        // [...]

        return cell;
    }
}r
4

3 に答える 3

0

オブジェクトを割り当て初期化しないでくださいcellForRowAtIndexPath。おそらく大量のメモリがリークしています。このメソッドは、以前に表示されたセルであっても、セルが表示されるたびに呼び出されることに注意してください。

また、文字列変数への割り当ては冗長です。このようにすれば十分です。

BOOL firstCell = (indexPath.row==0 && indexPath.section==0);
NSString *cellIdentifier = firstCell ? @"FirstMainCell" : @"MainCell"; 
UITableViewCell *genericCell = [tableView 
                         dequeueReusableCellWithIdentifier:cellIdentifier];

if (firstCell) {
   cell = (CellTemplateFirstNews*) genericCell;
   // configure...
} 

else {
   cell = (CellTemplateNews*) genericCell;
   // configure...
}

return cell;

遅延のもう 1 つの考えられる理由は、Web サービスへの同期呼び出しです。セルが表示されるたびにこれを行っています。画像を遅延してロードし、必要に応じて UI を更新する必要があります。

于 2013-01-07T16:22:52.583 に答える
0

Xib に を入力し忘れた可能性がありCellIdentifierます。実際、reuseIdentifier メソッドでは、セルに同じ識別子が必要ですが、セルを作成するときにそれを設定することはありません。Xib 内のこれらのセルには、識別子を入力する必要があります。

于 2013-01-07T16:39:08.790 に答える
0

主な問題は、再利用されているかどうかにかかわらず、すべてのセルに対して発生している同期ネットワーク リクエストだと思います。犯人はdataWithContentsOfURL:

このリンゴのサンプル コードを確認するか、「ios lazy table images」というフレーズをググってください。 この SO answerでは、イメージの非同期ロードを処理し、完了時に正しいテーブル ビュー行を見つけて更新する、かなり簡単に実装できるメソッドを提供します。

于 2013-01-07T20:51:06.490 に答える