0

以下の方法でテーブルビューをロードしています。条件が満たされた場合、特定の画像を の上に追加する必要がありcell.imageviewます。また、画像はさまざまな次元で来ています。以下は私のコードです。誰でも私が間違っているところを指摘できます。

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
if(array==nil||[array count]==0)
{

}
else
{
    NSMutableDictionary *dicttable=[array objectAtIndex:indexPath.row];
    NSString *head=[dicttable objectForKey:@"name"];
    NSString *type=[dicttable objectForKey:@"type"];

    NSString *imgUrl = [dicttable objectForKey:@"image"];;
    if(imgUrl!=nil)
    {
        if(![[ImageCache sharedImageCache] hasImageWithKey:imgUrl])
        { 
            cell.imageView.image = [UIImage imageNamed:@"noimage_icon.png"];
            NSArray *myArray = [NSArray arrayWithObjects:cell.imageView,imgUrl,@"noimage_icon.png",[NSNumber numberWithBool:NO],nil];
            AppDelegate *appDelegate = (AppDelegate  *)[[UIApplication sharedApplication] delegate];
            [appDelegate performSelectorInBackground:@selector(updateImageViewInBackground:) withObject:myArray];
            cell.imageView.frame=CGRectMake(0,0,48,48);
            cell.imageView.bounds=CGRectMake(0,0,48,48);
            [cell.imageView setClipsToBounds:NO];
        }
        else
        {
            cell.imageView.image = [[ImageCache sharedImageCache] getImagefromCacheOrUrl:imgUrl];
            cell.imageView.frame=CGRectMake(0,0,48,48);
            cell.imageView.bounds=CGRectMake(0,0,48,48);
            [cell.imageView setClipsToBounds:NO];
        }
    }
    else
    {
        cell.imageView.image = [UIImage imageNamed:@"noimage_icon.png"];
    }
    if([type isEqualToString:@"YES"])
    {
        UIImageView* img = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"bluel.png"]];
        [cell setBackgroundView:img];
        [img release];

        cell.textLabel.text = head;
        cell.textLabel.backgroundColor = [UIColor clearColor];

        cell.detailTextLabel.textColor=[UIColor grayColor];
        cell.detailTextLabel.text = subtitle1;
        cell.detailTextLabel.backgroundColor = [UIColor clearColor];
    }
    else
    {
        UIImageView* img = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"wnew1.png"]];
        [cell setBackgroundView:img];
        [img release];
        cell.textLabel.text = head;
        cell.textLabel.backgroundColor = [UIColor clearColor];
        [cell.imageView addsubview:spclimage]

        cell.textLabel.text = head;
        cell.textLabel.backgroundColor = [UIColor clearColor];

        cell.detailTextLabel.textColor=[UIColor grayColor];
        cell.detailTextLabel.text = subtitle1;
        cell.detailTextLabel.backgroundColor = [UIColor clearColor];            
    }
}
return cell;

ここで問題となるのは、特別なイメージが追加されている最後の行だけです。すべての行ではありません。また、テーブルビューのリロード中は常に画像ビューのサイズが異なりますか?

4

1 に答える 1

1

いくつかの考え:

  1. 名前updateImageViewInBackgroundが画像ビューを更新していることを示唆しているため、疑わしいようですが、更新しているセルを指定していません。

  2. をしているのも見えますaddSubview:spclimage。明らかに、それspclimageが別のセルにあった場合、それを行うとすぐに、addSubview現在のセルに追加される前に以前の場所から削除されます。実際、既存のイメージビューのサブビューとしてイメージを追加するという概念だけでも興味深いものです。

  3. キャッシュに画像がまだない場合、 で画像を初期化しているnoimage_icon.png場所はわかりますが、実際に画像ビューを更新している場所はわかりません。あなたupdateImageViewInBackgroundは「それから画像を更新する」と言います。これのために、これimageのために、プロパティを設定するということですか? それとも更新していますか?もしそうなら、それは問題です。imageViewcellindexPathspclimage

  4. これの典型的なパターン ( を使用GCD) は次のようになります。

    cell.imageView.image = [UIImage imageNamed:@"noimage_icon.png"];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        UIImage *image = ... // do whatever you need to do to get the image, load cache, etc.
    
        // ok, now that you have the image, dispatch the update of the UI back to the main queue
    
        dispatch_async(dispatch_get_main_queue(), ^{
    
            // because we're doing this asynchronously, make sure the cell is still
            // visible (it could have scrolled off and the cell was dequeued and
            // reused), so we're going to ask the tableview for the cell for that
            // indexPath, and it returns `nil` if it's not visible. This method is
            // not to be confused with the similarly named `UITableViewControllerDelegate`
            // method.
    
            UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    
            // if the image view is still visible, update it
    
            if (cell)
            {
                cell.imageView.image = image;
            }    
        });
    
    });
    
于 2013-01-03T15:08:20.480 に答える