2015-04-27 2 views
0

У меня возникает одна проблема относительно того, что ячейки UITableView смешиваются при прокрутке, особенно для изображений.iOS: ячейки UITableView смешиваются при прокрутке

Я не уверен, почему это происходит.
У меня есть переменная для отображения, а затем ее смешивание.
Ниже мой код.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"FriendsCell"; 
    FriendsTableCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (cell == nil) 
    { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"FriendsTableCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
    } 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    FriendsTableCell *simpleTableCell = (FriendsTableCell *)cell; 

    _model = [_contentArray objectAtIndex:indexPath.row]; 

    simpleTableCell.nameLabel.text = _model.fullname; 

    if(_friendsSegmentControl.selectedSegmentIndex == 0) { 

     simpleTableCell.followButton.hidden = NO; 
     simpleTableCell.removeButton.hidden = NO; 
     simpleTableCell.unBlockButton.hidden = YES; 
     simpleTableCell.ignoreRequest_btn.hidden = YES; 
     simpleTableCell.rejectRequest_btn.hidden = YES; 
     simpleTableCell.acceptRequest_btn.hidden = YES; 

     simpleTableCell.removeButton.tag = indexPath.row; 
     [simpleTableCell.removeButton addTarget:self action:@selector(deleteFriend_btn:) forControlEvents:UIControlEventTouchUpInside]; 

     simpleTableCell.followButton.tag = indexPath.row; 

     if([_model.isfollowed isEqualToString:@"YES"]) { 
      [simpleTableCell.followButton setImage:[UIImage imageNamed:@"follow_yellow.png"] forState:UIControlStateNormal]; 
      [simpleTableCell.followButton addTarget:self action:@selector(unfollowFriend_btn:) forControlEvents:UIControlEventTouchUpInside]; 
     } 
     else { 
      [simpleTableCell.followButton setImage:[UIImage imageNamed:@"follow_white.png"] forState:UIControlStateNormal]; 
      [simpleTableCell.followButton addTarget:self action:@selector(followFriend_btn:) forControlEvents:UIControlEventTouchUpInside]; 
     } 
    } 

    NSString *escapedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,(__bridge CFStringRef) _model.prof_pic,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8)); 

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 
    dispatch_async(queue, ^(void) { 

     NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.touristtube.com/%@",escapedString]]]; 
     UIImage *image = [UIImage imageWithData:imageData]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      simpleTableCell.profileImageView.image = image; 
     }); 
    }); 

} 
+0

Вы извлекаете данные изображения асинхронно. К моменту завершения поиска ячейка повторно используется для другой строки. – Paulw11

+0

Хорошо, так что, похоже, решение, нужно ли мне прямое изображение изображения, пожалуйста, помогите мне на этом – Kashif

+0

@ Paulw11, вы абсолютно правы. –

ответ

0

Две вещи, которые необходимо обеспечить при создании клеток для таблицы view-

1) Что касается многоразовых клеток - Как вы используете многоразовые клетки, так что в случае, если она удалена из очереди он будет показывать данные для пути индекса, для которого он был изначально создан. Контейнер

Это правильно, что вы обновляете каждую ячейку (будь то вновь созданные/из очереди) с данными для соответствующего индекса пути непосредственно перед отображением его в

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

Также вы можете обновить данные для каждой ячейки» для соответствующего индексного пути в

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

как хорошо.

Итак, убедитесь, что, если ячейка повторно используется, вы должны обновить данные каждого контейнера (подчиненные ячейки) с данными для текущего пути указателя. Это позволит решить проблему с перекрытием содержимого ячейки.

2) Что касается асинхронной загрузки изображений для клеток - Кроме того, как вы загружаете изображения асинхронно, поэтому он не будет блокировать основной поток и, как только изображение загружается вам нужно переключиться на основной поток, чтобы установить изображение в ячейку.

Теперь необходимо помнить, что при асинхронной загрузке изображений вы должны всегда обращаться к ячейке для правильного пути указателя в основном потоке и устанавливать загруженное изображение в представление изображения ячейки для пути индекса, для которого он был запланирован для загрузки.

Таким образом, для изображений, которые вы должны обновить изображения метода загрузки, как

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 
    dispatch_async(queue, ^(void) { 

     NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.touristtube.com/%@",escapedString]]]; 
     UIImage *image = [UIImage imageWithData:imageData]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      FriendsTableCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
      cell.profileImageView.image = image; 
      [cell setNeedsLayout]; 
     }); 
    }); 

это будет решить проблему образа ячейки, предназначенный для отображения на пути индекса, но на самом деле, показывая на ячейке в каком-то другом пути индекса ,

Смежные вопросы