Проблема рендеринга с UITableview - PullRequest
1 голос
/ 17 мая 2010

У меня очень странная проблема с UITableview в контроллере навигации на симуляторе iPhone. Из отображаемых ячеек правильно отображаются только некоторые. Предполагается, что все они выглядят одинаково, но большинству не хватает установленного мной аксессуара, прокручивая вид, который показывает, какая ячейка имеет аксессуар, поэтому я подозреваю, что происходит какое-то кэширование ячеек, хотя содержимое каждой ячейки корректно. Я также установил изображение в качестве фона, и оно также отображалось только время от времени, но я исправил это, изменив

cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yellow-bar_short.png"]];

(который также отображал только случайную ячейку с фоном) до

cell.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"yellow-bar_short.png"]];

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

По сути, это табличное представление (UITableViewCellStyleSubtitle), которое получает информацию от сервера и затем обновляется методом делегата, вызывающим перезагрузку. Код:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
  NSLog(@"%@", [NSString stringWithFormat:@"Setting colours for cell %i", indexPath.row]);

  // Set cell background
  // cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yellow-bar_short.png"]];
  cell.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"yellow-bar_short.png"]];
  cell.textLabel.backgroundColor = [UIColor clearColor];
  cell.detailTextLabel.backgroundColor = [UIColor clearColor];

      // detailTableViewAccessory is a view containing an imageview in this view's nib
      // i.e. nib <- view <- imageview <- image
  cell.accessoryView = detailTableViewAccessory;
}

// Called by data fetching object when done
-(void)listDataTransferComplete:(ArticleListParser *)articleListParserObject
{
  NSLog(@"Data parsed, reloading detail table");
  self.currentTotalResultPages = (((articleListParserObject.currentArticleCount - 1) / 10) + 1);
  self.detailTableDataSource = [articleListParserObject.returnedArray copy]; // make a local copy of the returned array

  // Render table again with returned array data (neither of these 2 fixed it)
  [self.detailTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
  // [self.detailTableView reloadData];

  // Re-enable necessary buttons (including table cells)
  letUserSelectRow = TRUE;
  [btnByName setEnabled:TRUE];
  [btnByPrice setEnabled:TRUE];

  // Remove please wait message
  NSLog(@"Removing please wait view");
  [pleaseWaitViewControllerObject.view removeFromSuperview];
}

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

1 Ответ

1 голос
/ 21 мая 2010

Решено! То, что я считал проблемой рендеринга, было на самом деле просто проблемой глупости с моей стороны (служит мне прямо для слепого следования учебнику). IB создавал только один экземпляр вспомогательного представления, который был назначен одной ячейке. Исправлено путем воссоздания вида каждой соты:

cell.accessoryView = detailTableViewAccessory;

заменено на

UIImageView *cellAccessoryView = [[UIImageView alloc] initWithFrame:CGRectMake(308, 0, 12, 75)];
cellAccessoryView.image = [UIImage imageNamed:@"blue-accessory-pointer.png"];
[cell.contentView addSubview:cellAccessoryView];
[cellAccessoryView release];

Я должен также добавить, что проблема с фоном ячейки была исправлена ​​с помощью той же методологии. Также вместо строки addSubview вы можете использовать

cell.accessoryView = cellAccessoryView;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...