2010-05-19 6 views
5

Ich habe eine benutzerdefinierte UITableViewCell Klasse mit einem UIButton, einem UIImage und zwei UILabels erstellt. Die Schaltfläche und das Bild werden übereinander gelegt und jeweils nur eine angezeigt. Das erwartete Verhalten ist das Berühren der Schaltfläche, die Schaltfläche wird ausgeblendet und das Bild wird angezeigt. Die UITableViewCells sind so eingestellt, dass sie wiederverwendet werden. Hier ist mein Code:Benutzerdefinierte UITableViewCell wird nicht am Set needsDisplay

Constructor:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { 
     unheartButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain]; 

     unheartButton.backgroundColor = [UIColor clearColor]; 
     unheartButton.frame = CGRectMake(10, 13, 20, 18); 

     [unheartButton addTarget:self action:@selector(onButtonClick:) forControlEvents:UIControlEventTouchUpInside]; 
     [unheartButton setBackgroundImage:[UIImage imageNamed:@"redheart.png"] forState:UIControlStateNormal]; 

     imageView = [[UIImageView alloc] init]; 
     imageView.frame = CGRectMake(12, 13, 16, 16); 

     NSMutableArray *array = [[NSMutableArray alloc] init]; 

     for (int ndx = 1; ndx < 13; ndx++) { 
      [array addObject:[UIImage imageNamed:[NSString stringWithFormat:@"icon-loading-%d (dragged).tiff", ndx]]]; 
     } 

     imageView.animationImages = array; 
     imageView.animationDuration = 1; 

     [array release]; 

     [self.contentView addSubview:imageView]; 
     [self.contentView addSubview:unheartButton]; 

     return self; 
    } 
} 

    - (void) setModel:(MyModel *)myModel { 
     model = myModel; 

     if (model.hideImage) { 
       imageView.hidden = YES; 
       unheartButton.hidden = NO; 
     else { 
       imageView.hidden = NO; 
       unheartButton.hidden = YES; 
     } 
    } 

Button-Klick:

- (IBAction) onButtonClick: (id) sender { 
    model.hideImage = NO; 

    unheartButton.hidden = YES; 
    imageView.hidden = NO; 
    [imageView startAnimating]; 

    [self setNeedsDisplay]; 
    [self.contentView setNeedsDisplay]; 
    [self.unheartButton setNeedsDisplay]; 
    [self.imageView setNeedsDisplay]; 
} 

Ich setNeedsDisplay auf alles fordern, aber nichts scheint zu passieren. Wenn ich vom Bildschirm blättere und wieder hochfahre, ist die Schaltfläche ausgeblendet und jetzt wird das Ladesymbol angezeigt, dies geschieht jedoch nur nach einem Bildlauf. Ich bin mir nicht sicher, was ich tun muss, damit die Zelle neu streichen kann.

Antwort

2

Das UITableView führt einige ausgefallene Cachespeicher durch, um das Scrollen und Ähnliches zu unterstützen; Ich hatte ähnliche Probleme beim Aktualisieren einer bestimmten Zelle, wenn ich benutzerdefinierte Ansichten verwende.

Sie können reloadRowsAtIndexPaths verwenden: withRowAnimation: Damit die Tabelle nur diese Zeile neu lädt. Sehen Sie diesen Beitrag für weitere Informationen: Why won't my UITableViewCell deselect and update its text?

+0

In meiner benutzerdefinierten UITableViewCell ich hinzufügen NSIndexPath und weisen Sie auf die Zelle, dann die Zelle I nennen dies neu zu ziehen: [self.tableView reloadRowsAtIndexPaths: [NSArray arrayWithObject: currentCell.indexPath] withRowAnimation: UITableViewRowAnimationNone]; –

Verwandte Themen