2 votes

UISwitch dans UITableViewCell

J'ai une vue tableau avec une cellule personnalisée ( UISwitch sur chaque cellule du tableau).

J'ai réglé ma cellule comme ceci :

switchView = [[UISwitch alloc] initWithFrame:CGRectMake(200.0f, 5.0f, 75.0f, 30.0f)];
cell.accessoryView = switchView;
[switchView setOn:NO animated:NO];
[switchView addTarget:self action:@selector(favorite:) forControlEvents:UIControlEventValueChanged];
[cell addSubview:switchView];

Et l'action qui est appelée par l'utilisateur quand il change le UISwitch est :

-(IBAction)favorite:(id)sender 
{
    indexPath = [self.tableView indexPathForCell:(UITableViewCell*)[sender superview]];
    NSMutableArray *favoriteList = [[NSMutableArray alloc]init];
    NSString *favoriteItem = [self.tableView cellForRowAtIndexPath:indexPath].textLabel.text;
    NSLog(favoriteItem);

    if ([switchView isOn]) 
    {
        [favoriteList addObject:favoriteItem];

        NSUserDefaults *favoriteDefaults = [NSUserDefaults standardUserDefaults];
        [favoriteDefaults setObject:favoriteList forKey:@"MyFavorites"];
        NSLog(@"%@", favoriteList);
    }
    else
    {
        [favoriteList removeObject:favoriteItem];

        NSUserDefaults *favoriteDefaults = [NSUserDefaults standardUserDefaults];
        [favoriteDefaults setObject:favoriteList forKey:@"MyFavorites"];
        NSLog(@"%@", favoriteList);
    }
}

Le problème est que :
Lors du test de l'application, seul le dernier élément (cellule) de la vue tableau fonctionne correctement.

Pour les autres, le débogueur renvoie que l'état du UISwitch est toujours "OFF".

Quel est le problème ?

4voto

Rob Points 70987

Quelques réactions immédiates :

  1. Sur (IBAction)favorite:(id)sender vous ne saisissez pas le switchView de la cellule en question, mais vous utilisez simplement ce qui a été utilisé par la dernière référence de cette classe ivar. De même, dans votre cellForRowAtIndexPath vous semblez définir (et réinitialiser de façon répétée) ce même et unique switchView ivar. Ça ne devrait probablement pas être un ivar du tout. Tu pourrais faire switchView une variable locale de cellForRowAtIndexPath . Vous pouvez également en faire une variable locale de favorite . Mais le plus important, favorite devrait le définir comme UISwitch *switchView = sender .

  2. Je suppose que vous voulez sauvegarder tous vos favoris dans les valeurs par défaut de l'utilisateur. Votre version (IBAction)favorite:(id)sender recréera la liste des favoris à chaque fois, et elle contiendra soit un élément, soit aucun élément, mais elle ignorera certainement tous les autres favoris que vous avez pu sélectionner dans le passé.

  3. Un point mineur, mais si vous définissez la cellule accessoire, vous n'avez pas besoin d'ajouter également le switchView à la sous-vue.

Donc, je suggère de modifier cellForRowAtIndexPath comme suit :

NSString *title = [_favorites objectAtIndex:indexPath.row]; // clearly, you'll get the text however you're getting your text now ... I'm just storing in array
cell.textLabel.text = title;

BOOL isFav = [self isFavorite:title]; // go to user defaults and find out if it's there or not

UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectMake(200.0f, 5.0f, 75.0f, 30.0f)];
[switchView setOn:isFav animated:NO];
[switchView addTarget:self action:@selector(toggleFavoriteSwitch:) forControlEvents:UIControlEventValueChanged];
cell.accessoryView = switchView;

Cela utilise isFavorite :

- (BOOL)isFavorite:(NSString *)title
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSArray *listOfFavorites = [userDefaults objectForKey:kMyFavsKey];

    if (listOfFavorites)
        return [listOfFavorites containsObject:title];

    return NO;
}

Ensuite, évidemment, vous devez définir votre toggleFavoriteSwitch (précédemment appelé favorite ) :

- (IBAction)toggleFavoriteSwitch:(UISwitch *)switchView
{
    UITableViewCell *cell = (UITableViewCell *)[switchView superview];

    [self updateFavoriteInUserDefaultsFor:cell.textLabel.text withValue:[switchView isOn]];
}

Et ceci met à jour les valeurs par défaut des utilisateurs comme suit :

- (void)updateFavoriteInUserDefaultsFor:(NSString *)title withValue:(BOOL)isOn
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSArray *oldFavorites = [userDefaults objectForKey:kMyFavsKey];

    NSMutableArray *newFavorites;

    if (!oldFavorites)
        newFavorites = [[NSMutableArray alloc] init];
    else
        newFavorites = [NSMutableArray arrayWithArray:oldFavorites];

    if (isOn)
        [newFavorites addObject:title];
    else
        [newFavorites removeObject:title];

    [userDefaults setObject:newFavorites forKey:kMyFavsKey];

    [userDefaults synchronize];
}

J'espère que cela résoudra votre problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X