0

J'ai une vue avec un curseur personnalisé. Nous utilisons une sous-classe de TableViewController qui génère des instances de UITableViewCell. À l'intérieur de chaque tableViewCell, nous ajoutons notre curseur personnalisé (une vue d'interface utilisateur) en tant que sous-vue. Ici, nous avons une vue qui sert de bouton de contrôle du curseur. C'est juste une sous-classe de UIView avec un reconnaisseur de gestes. La méthode drawRect pour la classe de boutons de contrôle prend un UIImage et exécute drawAtPoint. Cela fonctionne très bien! Pour résumer, nous avons:Pourquoi drawAtPoint crée-t-il des images en double dans la vision du contenu de mon tablecell?

UITableView -> UITableViewCell -> UITableViewCell.contentView -> SliderView -> SliderKnob -> UIImage

Le problème se produit lorsque nous faisons défiler une cellule de table de la vue de la table. L'UIImage pour le bouton persiste. Nous finissons par obtenir une copie de l'image restante chaque fois que la cellule est retirée. J'ai configuré quelques instructions NSLog et confirmé que drawRect est appelé dans chacune des sous-vues. Y at-il quelque chose que je dois faire pour rafraîchir le rendu de la cellule? J'ai essayé d'utiliser setNeedsDisplay sur les sous-vues de UITableViewCell mais je n'ai pas réussi à empêcher la duplication de UIImage.

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

    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
             reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    SliderView *slider = [[[SliderView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 130)] autorelease]; 

    // Configure the data for the cell. 
    NSDictionary *dataItem = [data objectAtIndex:indexPath.row]; 
    slider.dimensionName = [dataItem objectForKey:@"Name"]; 
    slider.upperExtreme = [dataItem objectForKey:@"Upper Extreme"]; 
    slider.lowerExtreme = [dataItem objectForKey:@"Lower Extreme"]; 
    slider.score = [[dataItem objectForKey:@"Score"] intValue]; 

    cell.selectionStyle = UITableViewCellEditingStyleNone; 
    cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"track_grainy.png"]]; 
    [cell.contentView addSubview:slider]; 

    return cell; 
} 
+0

Pouvez-vous s'il vous plaît poster votre méthode 'cellForRowAtIndexPath' quand vous avez un moment? – iwasrobbed

+0

Bien sûr! Je viens de l'ajouter pour vous. –

Répondre

0

Le problème était que nous étions les programmeurs débutants et avait été allocing une nouvelle instance de la SliderView chaque fois qu'une cellule a été mise à jour. C'est évidemment très mauvais. Nous avons fini par sous-classer UITableViewCell et instancier notre vue de contenu personnalisée sur son init avec frame. En faisant cela, nous pourrions maintenir la vue personnalisée en mémoire et la mettre à jour en mettant à jour la cellule. Il est ensuite libéré correctement lorsque les cellules sont libérées de la vue de la table.