2013-07-25 4 views
3

У меня есть UITableView с пользовательская ячейка. Пользовательская ячейка содержит UIView. Изображение загружается здесь асинхронно. Но при прокрутке моего представления таблицы изображения в ячейке меняются. Вот мой код:UITableView изменение изображения при прокрутке

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"MyCell"; 
    MSAppointmentsModel *data = [self.appointments objectAtIndex:indexPath.row]; 

    MSAppointmentsCell *cell = (MSAppointmentsCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     NSArray *ar = [[NSBundle mainBundle] loadNibNamed:[Common checkDeviceforController:@"MSAppointmentsCell"] owner:nil options:nil]; 
     for (id eachObject in ar) { 
      if ([eachObject isKindOfClass:[UITableViewCell class]]) { 
       cell = eachObject; 
      } 
     } 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
     dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
      NSURL *imgUrl = [NSURL URLWithString:[data.cusDetails objectForKey:@"customer_image"]]; 
      NSData *imgData = [NSData dataWithContentsOfURL:imgUrl]; 
      UIImage *image = [UIImage imageWithData:imgData]; 
      dispatch_sync(dispatch_get_main_queue(), ^{ 
       [cell.medallionView setImage:image]; 
      }); 
     }); 

     if (data.comp_status == YES) { 
      cell.status.image = [Common imageResize:[UIImage imageNamed:@"CheckMark_green.png"] andResizeTo:cell.status.frame.size]; 
     } 

    } 

    cell.custName.text = [data.cusDetails objectForKey:@"customer_name"]; 
    cell.service.text = [data service]; 
    cell.empName.text = [NSString stringWithFormat:@"by %@",[data.empDetails objectForKey:@"employee_name"]]; 


    return cell; 
} 

Пожалуйста, помогите мне.

ответ

4

Попробуйте это,

1: Возьмите массив для кэширования изображения NSMutableArray * imageicons;

2: после загрузки данных добавьте значения NULL в массив;

imageicons=[[NSMutableArray alloc] init]; 

for (int i=0; i<[self.appointments count]; i++) 
{ 
[imageicons insertObject:[NSNull null] atIndex:i]; 
} 

3:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(indexPath.row < [imageicons count] && [imageicons objectAtIndex:indexPath.row] != [NSNull null]) 
     { 
      [cell.bookimage setImage:[imageicons objectAtIndex:indexPath.row]]; 
      NSLog(@"Array Hit"); 

     } 
     else{ 
     NSLog(@"Count of %i Size of %li Array and row number %i",[imageicons count],sizeof(imageicons),indexPath.row); 
     [NSThread detachNewThreadSelector:@selector(DownloadImageInBackground:) toTarget:self withObject:indexPath]; 
     } 
} 

-(void)DownloadImageInBackground:(NSIndexPath *)path 
{ 
MSAppointmentsModel *data = [self.appointments objectAtIndex:indexPath.row]; 
NSString *str=[data.cusDetails objectForKey:@"customer_image"]; 

    imagetodisplay = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:str]]]; 

if (imagetodisplay==Nil) 
{ 

    // set deault image 
    [imageicons replaceObjectAtIndex:path.row withObject:[UIImage imageNamed:@"defaultimg.png"]]; 
} 
else 
{ 

    MSAppointmentsCell *cell=(MSAppointmentsCell *)[self.booktableview cellForRowAtIndexPath:path]; 
    [cell.bookimage setImage:imagetodisplay]; 
    //NSLog(@"Count of %i Size of %li Array and row number %i",[imageicons count],sizeof(imageicons),path.row); 

    [imageicons replaceObjectAtIndex:path.row withObject:imagetodisplay]; 


} 

} 
+0

работает отлично. спасибо – manujmv

+0

+1 NSNull - это объект! – rjobidon

0

Попробуйте добавить setNeedsDisplay вызов на ImageView после cell.empName.text = ...

Жаль, что я что-то упускается из виду. обновлено.

+0

ничего не произошло – manujmv

0

Я бы предположил, что medallionView хранит изображение, поэтому есть несколько проблем.

Вы испытываете ошибку, поскольку вы деактивируете ячейку, но не только устанавливаете текст метки custName, service и empName, а не изображение (medallionView). Таким образом, в основном, он рисует (screensize/cellheight) количество строк (пример 9), заполняет эти ячейки, а затем продолжает их повторное использование, с каким изображением он находит там.

Кроме того, когда я выполнял асинхронные запросы, мне было сказано никогда не рисовать внутри асинхронного запроса, вместо этого просто получить все изображения из URL-адреса и сохранить их в массиве, а затем, когда все будет загружено, 1) уведомить делегата tableView класс для перезагрузки данных ИЛИ 2) имеет метод делегирования, который выполняется ПОСЛЕ загрузки данных ИЛИ 3) Имейте блок завершения, который выполняется после загрузки каждого изображения.