2010-05-17 2 views
1

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

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

Решено! То, что я считал проблемой рендеринга, было на самом деле просто проблемой глупости с моей стороны (служит мне для слепого следования за учебником). 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;