2009-12-03 3 views
1

J'affiche des données en utilisant un UITableViewController, ma table a 2 sections statiques avec 6 rangées statiques chacune. Et je suis sous-classe UITableViewCell afin d'ajouter 3 étiquettes et une vue, dans la vue, je dessine une flèche dans une seule des cellules dans l'une des sections.UITableView image changess de défilement dans UITableViewCell

Tout va parfaitement bien. Jusqu'à ce que je défile vers le bas ... alors la flèche est placée aléatoirement dans d'autres cellules, une fois que je remonte la flèche a de nouveau changé de cellules ... Cela arrive aussi si j'essaie de définir backgroundColor pour une seule des cellules. Une fois que je fais défiler vers le bas et vers le haut la cellule qui avait initialement la couleur ne l'a plus, et une autre cellule apparemment aléatoire a maintenant la couleur.

Voici une partie de mon code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

TableViewCells *cell = (TableViewCells *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[TableViewCells alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 
[self configureCell:cell atIndexPath:indexPath]; 


return cell; 

}

- (void)configureCell:(TableViewCells *)cell atIndexPath:(NSIndexPath *)indexPath { 
switch (indexPath.row) { 
    case 0: 
    { 
     if (indexPath.section == cotizacionIdeal) 
     { 
      cell.arrowImage = [UIImage imageNamed:@"arrowUp.png"]; 
      [cell.nombre setText:@"Recursos"]; 
      [cell.cantidad setText:[NSString stringWithFormat:@"%1.2f", [cotizacionPrevia.sueldoDeRecursos doubleValue]]]; 
      [cell.porcentaje setText:[NSString stringWithFormat:@"%1.2f%@", [cotizacion.recursosPorcentaje doubleValue], @"%"]]; 
     } 
     else 
     { 
      [cell.nombre setText:@"Recursos"]; 
      [cell.cantidad setText:[NSString stringWithFormat:@"%1.2f", [cotizacionPrevia.sueldoDeRecursos doubleValue]]]; 
      [cell.porcentaje setText:[Calculate calcPorcentaje:cotizacionPrevia.sueldoDeRecursos totalReal:self.totalReal]]; 
     } 
    } 
     break; 
    case 1: 
    { 
     if (indexPath.section == cotizacionIdeal) 
     { 
      [cell.nombre setText:@"Comision de Venta"]; 
      [cell.cantidad setText:[Calculate calcMonto:cotizacion.comisionPorcentaje total:self.totalIdeal]]; 
      [cell.porcentaje setText:[NSString stringWithFormat:@"%1.2f%@", [cotizacion.comisionPorcentaje doubleValue], @"%"]]; 
     } 
     else 
     { 
      [cell.nombre setText:@"Comision de Venta"]; 
      [cell.cantidad setText:self.montoRealComision]; 
      [cell.porcentaje setText:[NSString stringWithFormat:@"%1.2f%@", [cotizacion.comisionPorcentaje doubleValue], @"%"]]; 
     } 
    } 

UITableViewCell Classe:

- (id)initWithFrame:(CGRect)frame cell:(TableViewCells *)cell 
{ 
    if (self = [super initWithFrame:frame]) { 
     _cell = cell; 

     //self.opaque = YES; 
     //self.backgroundColor = _cell.backgroundColor; 
    } 

    return self; 
} 

- (void)drawRect:(CGRect)rect 
{ 
    [_cell.arrowImage drawAtPoint:CGPointMake(0, 0)]; 
} 

@end 

@implementation TableViewCells 

@synthesize nombre; 
@synthesize porcentaje; 
@synthesize cantidad; 
@synthesize arrowImage; 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { 
     // Initialization code 

     UILabel *nombreLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 
     self.nombre = nombreLabel; 
     [nombreLabel release]; 
     [self.nombre setFont:[UIFont boldSystemFontOfSize:14]]; 
     [self.contentView addSubview:self.nombre]; 

     UILabel *porcentajeLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 
     self.porcentaje = porcentajeLabel; 
     [porcentajeLabel release]; 
     [self.porcentaje setFont:[UIFont italicSystemFontOfSize:10]]; 
     [self.contentView addSubview:self.porcentaje]; 

     UILabel *cantidadLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 
     self.cantidad = cantidadLabel; 
     [self.cantidad setTextAlignment:UITextAlignmentRight]; 
     [cantidadLabel release]; 
     [self.cantidad setFont:[UIFont boldSystemFontOfSize:14]]; 
     [self.contentView addSubview:self.cantidad]; 

     cellContentView = [[TableViewCellContentView alloc] initWithFrame:CGRectZero cell:self]; 
     cellContentView.backgroundColor = [UIColor clearColor]; 
     [self.contentView addSubview:cellContentView]; 
    } 

MISE À JOUR:

J'ai aussi essayé de placer l'image un diffère Un pour tout le monde sauf un et j'ai toujours le même problème.

- (void)configureCell:(TableViewCells *)cell atIndexPath:(NSIndexPath *)indexPath { 
cell.arrowImage = [UIImage imageNamed:@"arrowDown.png"]; 
switch (indexPath.row) { 
    case 0: 
    { 
     if (indexPath.section == cotizacionIdeal) 
     { 
      cell.arrowImage = [UIImage imageNamed:@"arrowUp.png"]; 
      [cell.nombre setText:@"Recursos"]; 
      [cell.cantidad setText:[NSString stringWithFormat:@"%1.2f", [cotizacionPrevia.sueldoDeRecursos doubleValue]]]; 
      [cell.porcentaje setText:[NSString stringWithFormat:@"%1.2f%@", [cotizacion.recursosPorcentaje doubleValue], @"%"]]; 
     } 
     else 
     { 

Répondre

1

Le problème est que chaque fois que vous utilisez drawRect pour une cellule, vous devez appeler setNeedsDisplay. C'est ce qui a réglé mon problème.

0

Le problème est que la UITableView réutilise cellules de sorte qu'il n'a pas besoin de faire plus de cas que sont affichés et que vous n'êtes pas enlever explicitement la flèche dans votre méthode configureCell.

Si la flèche ne doit pas être affichée sur une cellule, effacez-la explicitement dans la méthode configureCell et cela devrait être corrigé.

+0

Bonjour Ben, merci pour votre réponse, je suis conscient que les viewcells sont en cours de réutilisation et j'ai essayé d'effacer explicitement la propriété cell.arrowImage en la mettant à zéro. Cependant, cela ne fonctionne pas bien. Même si je définis des images différentes pour chaque cellule, une fois que je fais défiler vers le bas et vers le haut, les images sont mélangées. Je mets mes images dans chaque cellule de la même manière en les plaçant dans le premier. Comment dois-je gérer ce problème? Merci d'avance. -Oscar –

+0

J'ai aussi essayé aproche - (void) configureCell: (TableViewCells *) atIndexPath cellulaire: (NSIndexPath *) indexPath { \t cell.arrowImage = [UIImage imageNamed: @ "arrowDown.png"]; \t interrupteur (indexPath.row) { \t \t case 0: \t \t { \t \t \t si (indexPath.section == cotizacionIdeal) \t \t \t { \t \t \t \t cell.arrowImage = [UIImage imageNamed: @ "arrowUp.png"]; \t \t \t \t [cellule.nombre setText: @ "Recursos"]; [Set.cext de cellule.cantidad: [NSString stringWithFormat: @ "% 1.2f", [cotizacionPrevia.sueldoDeRecursos doubleValue]]]; Ce qui fonctionne bien jusqu'à ce que je défile vers le haut et vers le bas. –

+0

Je me demande si cela pourrait être parce que j'utilise le simulateur d'iphone? –

0

Je ne suis pas à 100% sur ce point mais je pense que c'est à voir avec la sortie de l'image. Lorsque vous utilisez imageNamed, l'instance est conservée, il est donc conseillé d'utiliser imageWithFilePath à la place.

Hope this helps ....

Questions connexes