UITableViewCell странное поведение, когда таблица прокручивается вне поля зрения - PullRequest
2 голосов
/ 10 марта 2009

У меня есть класс, который расширяет UITableViewCell. Для этого упражнения давайте назовем его «CustomCell». В CustomCell у меня есть настройка UIImageView IBOutlet. Имя экземпляра изображения в этом случае myImage. Я хочу отобразить это изображение на основе определенных критериев, полученных с сервера. Эти данные - словарь, который в этом упражнении мы будем называть «serverData». Во-первых, UITableView хорошо отрисовывается, когда UIImageView отображается в ячейках, что и должно быть. Проблема возникает, когда я начинаю прокручивать фактический UITableView, изображение теряется. Каким-то образом это неправильно кэшируется или удаляется из очереди. Не уверен, где проблема или как лучше улучшить этот код. Вот выдержка:

- (UITableViewCell *)tableView:(UITableView *)tableView
    cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *CustomCellIdentifier = @"CustomCellIdentifier";
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];
    if (cell == nil)  {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" 
                                                     owner:self options:nil];

        cell = (CustomCell *)[nib objectAtIndex:0];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }      

        NSDictionary *serverData = myData // previously defined.
        if ([[serverData valueForKey:@"foo"] isEqualToString:@"0"]) 
            cell.myImage.hidden = YES;
        cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
        return cell;
}    

Ответы [ 2 ]

5 голосов
/ 10 марта 2009

По причинам памяти UITableView повторно использует ячейки при прокрутке (например, вызов dequeueReusableCellWithIdentifier).

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

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

  NSDictionary *serverData = myData // previously defined.
  if ([[serverData valueForKey:@"foo"] isEqualToString:@"0"]) 
    cell.myImage.hidden = YES;
  else
    cell.myImage.hidden = NO;
3 голосов
/ 10 марта 2009

Помните, что ваши ячейки используются повторно, поэтому вам нужно сбрасывать значение cell.myImage.hidden при каждом использовании этой ячейки

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

            cell = (CustomCell *)[nib objectAtIndex:0];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
    } else {
            cell.myImage.hidden = NO;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...