2010-05-17 7 views
1

J'ai un problème très étrange avec une UITableview dans un contrôleur de navigation sur le simulateur de l'iPhone. Parmi les cellules affichées, seules certaines sont correctement affichées. Ils sont tous censés avoir la même apparence mais la plupart manquent l'accessoire que j'ai défini, le défilement de la vue change la cellule qui a l'accessoire donc je suspecte qu'il se passe une sorte de cache cellulaire, bien que le contenu soit correct pour chaque cellule. J'ai aussi mis une image en arrière-plan et qui était aussi que l'affichage de façon sporadique mais je fixe en changeantProblème de rendu avec UITableview

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

(qui a également que rendu une cellule aléatoire avec l'arrière-plan) pour

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

I maintenant besoin de résoudre le problème avec l'accessoire ne montrant que sur une cellule aléatoire. J'ai essayé de déplacer le code de cellForRowAtIndex à willDisplayCell mais cela n'a fait aucune différence. J'ai mis dans une commande de journal pour confirmer qu'il traverse chaque trame.

Fondamentalement, c'est une vue de table (UITableViewCellStyleSubtitle) qui obtient ses informations à partir d'un serveur & est ensuite mis à jour par une méthode de délégué appelant reload. Code est:

-(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]; 
} 

Je ne code inclus que je pensais était pertinent, peut fournir plus si nécessaire. Je ne peux pas encore le tester sur un iPhone, donc je ne sais pas si c'est peut-être juste une anomalie de simulateur ou un bug dans mon code. J'ai toujours eu de bons retours de questions, des idées?

Répondre

1

Résolu! Ce que je pensais être un problème de rendu n'était en fait qu'un problème de stupidité de ma part (ça me sert de suivre aveuglément un tutoriel). IB créait seulement une instance de la vue accessoire qui était assignée à une cellule. Correction en recréant la vue sur la création de chaque cellule:

cell.accessoryView = detailTableViewAccessory; 

remplacé par

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

Je dois aussi ajouter que la question que j'avais avec le fond de la cellule a été fixé avec la même méthodologie. En outre, à la place de la ligne addSubview, vous pouvez utiliser

cell.accessoryView = cellAccessoryView;