2010-02-13 8 views
2

Je crée un bouton pour chaque ligne de cellule dans un UITableView. Le bouton agit comme commutateur pour ajouter la ligne sélectionnée comme «favori» dans NSUserDefaults. Mon problème est que chaque fois que j'appuie sur ce bouton, un nouveau se dessine sur l'ancien. Comment puis-je le publier/réutiliser correctement? C'est ce que ma méthode cellForRowAtIndexPath ressemble:iPhone UIButton dynamique dans UITableView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"cellID"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    } 

    UIImage *favOn = [UIImage imageNamed:@"favOn.png"]; 
    UIImage *favOff = [UIImage imageNamed:@"favOff.png"];     
    UIButton *favButton = [[UIButton alloc] initWithFrame:CGRectMake(230, 0, 54, 54)]; 


    favButton.tag = viewTag; 

    [favButton setImage:favOff forState:UIControlStateNormal]; 
    [favButton setImage:favOn forState:UIControlStateSelected]; 

    if([self getFavState:viewTag]) { 

     [favButton setSelected:YES]; 
    } 
    else { 
     [favButton setSelected:NO]; 
    } 

    [favButton addTarget:self action:@selector(favButtonSwitch:) forControlEvents:UIControlEventTouchUpInside]; 
    [favButton setBackgroundColor:[UIColor clearColor]]; 
    [cell.contentView addSubview:favButton]; 
    [favButton release]; 

    return cell; 
} 

De plus j'utilise trois méthodes différentes pour les sélections des boutons:

- (void) setFavState:(BOOL)state withId:(NSString *)uid { 

    NSUserDefaults *savedData = [NSUserDefaults standardUserDefaults]; 
    [savedData setBool:state forKey:uid]; 
} 

- (BOOL) getFavState:(NSString *)uid { 

    NSUserDefaults *savedData = [NSUserDefaults standardUserDefaults]; 
    return [savedData boolForKey:uid]; 
} 

- (void) favButtonSwitch:(id) sender { 
    NSInteger senderId = [sender tag]; 
    NSString *senderString = [NSString stringWithFormat:@"%i", senderId]; 

    NSLog(@"sender:%i",senderId); 

    [self getFavState:senderString]; 

    if([self getFavState:senderString]) { 

     [self setFavState:NO withId:senderString]; 
    } 
    else { 
     [self setFavState:YES withId:senderString]; 
    } 

    [self.tableView reloadData]; 
} 

Répondre

1

Vous semblez être la création d'un nouveau bouton avec de nouvelles images chaque fois, même s'il a été extrait du cache. Déplacez le code pour créer un bouton avec des images dans le code qui crée une cellule pour la première fois.

if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    // Move all the image and button creation in here... 
} 
+0

Merci, cela ne fonctionne que partiellement, car il ne met pas à jour les états de sélection visuellement quand je tape/clique sur le bouton. Je vois qu'il a en effet été activé par le senderId mais pas d'états uicontrol sélectionnés/non sélectionnés (car il est alors mis en cache depuis le début précédent?) – scud

+0

Eh bien vous devez mettre le code pour régler l'état des boutons en dehors de ce bloc . Cela a-t-il du sens? Peut-être republier votre code comme il est maintenant? – willcodejavaforfood

+0

Je l'ai corrigé maintenant, ma plus grosse erreur était [self.tableView reloadData] dans la méthode button-toggle. Je l'ai remplacé par un vrai bascule comme ceci: if ([sender isSelected]) ... [sender setSelected: NO] – scud