Jameson
Jameson

Reputation: 4266

Single UIImageView is displaying two separate images

I have a UITableView in my app that for each cell pulls an image from the internet. While that image is being pulled, I have a placeholder image there (set in InterfaceBuilder). However, when I set the UIImageView to the new image from the web, it simply covers up the old image rather than replaces it. This would be fine except for the fact that you can actually see the old image, given that both images are aspect-fit and don't necessarily take up the whole imageView.

Is it a thread problem? Is there a method in which I can set the placeholder image so it is there immediately, even before cellForRowAtIndexPath?

enter image description here

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // Get a new or recycled cell
    RosterListingCellTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RosterCell" forIndexPath:indexPath];

    LineListing *thisRosterListing = [self.rosters objectAtIndex:indexPath.row];
    cell.playerNumberLabel.text = [NSString stringWithFormat:@"#%@",thisRosterListing.number];
    cell.playerNameLabel.text = thisRosterListing.name;


    cell.imageView.backgroundColor = [UIColor clearColor];

    cell.imageView.contentMode = UIViewContentModeScaleAspectFill;
    cell.imageView.clipsToBounds = YES;

    UIImage *playerImage = [self.imageCache objectForKey:thisRosterListing.playerImageURL];
    cell.imageView.image = playerImage;
    if (playerImage == nil) {

        NSURLSessionConfiguration *sessionConfig =
        [NSURLSessionConfiguration defaultSessionConfiguration];

        NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
        thisRosterListing.playerImageURL = [thisRosterListing.playerImageURL stringByReplacingOccurrencesOfString:@"small" withString:@"medium"];
        NSURLSessionDataTask *imageData = [session dataTaskWithURL:[NSURL URLWithString: thisRosterListing.playerImageURL]
                                                completionHandler:^(NSData *data,
                                                                    NSURLResponse *response,
                                                                    NSError *error) {
                                                    // handle NSData
                                                    UIImage *image = [UIImage imageWithData:data];
                                                    thisRosterListing.image = image;
                                                    [self.imageCache setObject:image forKey:thisRosterListing.playerImageURL];


                                                    dispatch_async(dispatch_get_main_queue(), ^{
                                                        cell.imageView.image = image;
                                                        [self.tableView reloadData];
                                                    });
                                                }];
        [imageData resume];
    }


    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
    imageView.image = [UIImage imageNamed:@"indicator"];
    cell.accessoryView = imageView;
    cell.backgroundColor = [UIColor clearColor];

    // set selection color
    UIView *myBackView = [[UIView alloc] initWithFrame:cell.frame];
    myBackView.backgroundColor = [UIColor clearColor];
    cell.selectedBackgroundView = myBackView;

    return cell;
}

Upvotes: 2

Views: 299

Answers (1)

villy393
villy393

Reputation: 3063

I think you are setting an image on two different UIImageViews. If you click the "Debug view hierachy"

enter image description here

button on the bottom toolbar when xcode is running what do you see. Are the images on two different imageviews. I don't think it possible for one UIImageView to share two UIImages

Upvotes: 3

Related Questions