0

UITableViewインターネットからいくつかの画像をリストするために使用しています。だから私はAFNetworking's setImageWithURLRequest:placeholderImage:success:failure:メソッドを使用します。画像がダウンロードされたら、何らかのプロセスを実行してから表示する必要があります。私が使用する処理された画像を更新するために

[wTableView beginUpdates];
[wTableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone];
[wTableView endUpdates];

成功ブロックで。これは初めてロードされたときに機能するようですが、テーブルビューをスクロールすると行がめちゃくちゃになり、1行が消えてメソッドでクラッシュしやすくなり[wTableView endUpdates];ます。この方法の何が問題になっていますか?関連するコード スニペットは次のとおりです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *tableIdentifier = @"cell";

    CouponTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:tableIdentifier];

    if (!cell) {
        cell = [[CouponTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:tableIdentifier];
    }
    [cell prepareForReuse];

    NSArray *coupons = [mCoupons objectAtIndex:indexPath.section];
    CouponDB *couponDB = [coupons objectAtIndex:indexPath.row];
    NSString *thumbLink;
    if (couponDB) {
        [cell.textLabel setText:couponDB.couponInfo.company];
        [cell.textLabel setFont:[UIFont boldSystemFontOfSize:CELL_LABEL_FONT_SIZE]];
        [cell.textLabel setTextColor:[UIColor grayColor]];
        [cell.textLabel setBackgroundColor:[UIColor clearColor]];
        [cell.detailTextLabel setText:[NSString stringWithFormat:@"Expires:%@",couponDB.couponInfo.deadline]];
        [cell.detailTextLabel setBackgroundColor:[UIColor clearColor]];
        thumbLink = [self thumbLink:couponDB.couponInfo.imgURL];
        [cell setNeedsLayout];

        if (couponDB.redeem_status) {
            UIImageView * __weak imageView = cell.imageView;
            CouponTableController * __weak table = self;
            UITableView *__weak wTableView = mTableView;
            [cell.imageView setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:thumbLink]] placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
                imageView.image = [table crossedImage:image];
                @synchronized(wTableView){
                    [wTableView beginUpdates];
                    [wTableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone];
                    [wTableView endUpdates];
                }

            } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                NSLog(@"cell imageview load error:%@",error);
            }];
        } else {
            [cell.imageView setImageWithURL:[NSURL URLWithString:thumbLink] placeholderImage:[UIImage imageNamed:@"default_cover.jpg"]];
        }

    }

    if (![cell.backgroundView isKindOfClass:[CouponTableCellBackgroud class]]) {
        cell.backgroundView = [[CouponTableCellBackgroud alloc] init];
    }

    return cell;
}

テーブルが初めてロードされるとき (スクロールなし) は次のようになります。 ここに画像の説明を入力

上下にスクロールすると、テーブルの行がめちゃくちゃになり、次のようになります。 ここに画像の説明を入力

任意の提案をいただければ幸いです。

4

3 に答える 3

0

これを試すことができますか:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
      static NSString *SimpleTableIdentifier = @"YourResuseIdentifier";

      CouponTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:tableIdentifier];

    if(cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:SimpleTableIdentifier];
    }
    else
    {
        for (UIView *subview in cell.contentView.subviews)
            [subview removeFromSuperview];
    }


    NSArray *coupons = [mCoupons objectAtIndex:indexPath.section];
    CouponDB *couponDB = [coupons objectAtIndex:indexPath.row];
    NSString *thumbLink;
    if (couponDB) {
        [cell.textLabel setText:couponDB.couponInfo.company];
        [cell.textLabel setFont:[UIFont boldSystemFontOfSize:CELL_LABEL_FONT_SIZE]];
        [cell.textLabel setTextColor:[UIColor grayColor]];
        [cell.textLabel setBackgroundColor:[UIColor clearColor]];
        [cell.detailTextLabel setText:[NSString stringWithFormat:@"Expires:%@",couponDB.couponInfo.deadline]];
        [cell.detailTextLabel setBackgroundColor:[UIColor clearColor]];
        thumbLink = [self thumbLink:couponDB.couponInfo.imgURL];

        if (couponDB.redeem_status) {
            UIImageView * __weak imageView = cell.imageView;
            CouponTableController * __weak table = self;
            UITableView *__weak wTableView = mTableView;
            [cell.imageView setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:thumbLink]] placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
                imageView.image = [table crossedImage:image];

                [wTableView beginUpdates];
                [wTableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone];
                [wTableView endUpdates];


            } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                NSLog(@"cell imageview load error:%@",error);
            }];
        } else {
            [cell.imageView setImageWithURL:[NSURL URLWithString:thumbLink] placeholderImage:[UIImage imageNamed:@"default_cover.jpg"]];
        }

    }

    if (![cell.backgroundView isKindOfClass:[CouponTableCellBackgroud class]]) {
        cell.backgroundView = [[CouponTableCellBackgroud alloc] init];
    }

    return cell;
}
于 2013-05-16T04:05:53.793 に答える