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