0

テーブル内の画像を非同期でダウンロードしています。テーブルが最初に表示されたとき、 connecion:didrecieveData は呼び出されませんが、上下に移動すると呼び出され、画像が表示されます。親切に助けて

テーブルビュークラス:

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

    static NSString *CellIdentifier = @"Cell";

    customiseForVideos *cell =(customiseForVideos *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"customiseForVideos" owner:self options:nil];
        cell=tblCell;
    }
    else{
        AsyncImageView* oldImage = (AsyncImageView*)
        [cell.contentView viewWithTag:999];
        [oldImage removeFromSuperview];

    }
    [cell.imageActivity startAnimating];

    CGRect frame;
    frame.size.width=65; frame.size.height=70;
    frame.origin.x=24; frame.origin.y=12;
    AsyncImageView* asyncImage = [[[AsyncImageView alloc]
                                   initWithFrame:frame] autorelease];
    asyncImage.tag = 999;
    NSURL* url = [NSURL URLWithString:[[videoCollection objectAtIndex:indexPath.row] videoImageUrl]];
        //NSLog(@"%@",url);
    [asyncImage loadImageFromURL:url activity:cell.imageActivity];

    [cell.contentView addSubview:asyncImage];

    if((indexPath.row%2)==0)
        cell.backgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"green-cell-row.png"]] autorelease];
    else{
        cell.backgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"blue-cell-row.png"]] autorelease];
    }
    return cell;
}

AsyncImageView クラス:

- (void)loadImageFromURL:(NSURL*)url activity:(UIActivityIndicatorView *)cellActivity {
    activityOnCell=cellActivity;
    activityOnCell.hidden=NO;
    if (self.connection!=nil) { [self.connection release]; } //in case we are downloading a 2nd image
    if (data!=nil) { [data release]; }

    NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; //notice how delegate set to self object
    NSLog(@"%@",request);
        //TODO error handling, what if connection is nil?
}


//the URL connection calls this repeatedly as data arrives
- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData {
    if (data==nil) { data = [[NSMutableData alloc] initWithCapacity:2048]; } 
    [data appendData:incrementalData];
}

//the URL connection calls this once all the data has downloaded
- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {
    //so self data now has the complete image 
    [self.connection release];
    self.connection=nil;
    if ([[self subviews] count]>0) {
        //then this must be another image, the old one is still in subviews
        [[[self subviews] objectAtIndex:0] removeFromSuperview]; //so remove it (releases it also)
    }

    //make an image view for the image
    UIImageView* imageView = [[[UIImageView alloc] initWithImage:[UIImage imageWithData:data]] autorelease];
    //make sizing choices based on your needs, experiment with these. maybe not all the calls below are needed.
    imageView.contentMode = UIViewContentModeScaleAspectFit;
    imageView.autoresizingMask = ( UIViewAutoresizingFlexibleWidth || UIViewAutoresizingFlexibleHeight );
    [self addSubview:imageView];
    imageView.frame = self.bounds;
    [imageView setNeedsLayout];
    [self setNeedsLayout];
    activityOnCell.hidden=YES;

    [data release]; //don't need this any more, its in the UIImageView now
    data=nil;
}
4

4 に答える 4

2

画像を TableView にロードすることはよくある問題です。ソリューションが低下するほどです。これらのいずれかを使用してから、独自の設計を試みる方がよいでしょう。多くの時間を節約し、通常は最適化されたソリューションを見つけ、さらに機能が必要な場合はいつでもサブクラス化できます。

新しい画像が入るたびにテーブルをリロードすることは、最善の解決策ではありません。ユーザーがスクロールしている場合にリロードすると、ユーザーは自分の位置を失います。

https://github.com/AFNetworking/AFNetworkingを使用

ここでは、必要なことを簡単に行うことができます。

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];

[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];
于 2012-05-22T07:26:27.950 に答える
1

画像を受け取った後、テーブルビューをリロードしていません。使用する

[mtableView reloadData]; 

接続で読み込みが完了しました。テーブルビューが存在するクラスと同じでない場合は、別のメソッドを作成し、リロードテーブルを配置し、デリゲートを使用して他のクラスからこれを呼び出します。

于 2012-05-22T07:22:53.290 に答える
0

1 行のコードですべてを実行する優れたサードパーティ パッケージがあります: https://github.com/rs/SDWebImage

このカテゴリをインポートするだけです ( #import "UIImageView+WebCache.h")

次に、- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{} 1 つの簡単な方法でセルの画像を設定する必要があります。

    [cell.imageView setImageWithURL:url placeholderImage:[UIImage imageNamed:@"noPic.png"]];

そして、あなたは完了です:)

于 2012-05-22T07:30:38.820 に答える
0

NSCache を使用して画像を一時的に保存し、url をキーとして、NSData を値として使用します。

メソッド cellforRowAtIndexPath で NSCache オブジェクトから値を取得し、それを imageview に割り当てます。ちらつきが止まり、見えるようになります。

于 2012-05-22T07:50:52.650 に答える