Question

J'ai une application de liste où les utilisateurs ont frappé le bouton + et entrez dans un élément qu'ils veulent apparaître dans la liste et cliquez sur Enregistrer. Le tableau est enregistré avec des données de base. Le seul problème est lorsque la cellule est enregistrée, je veux une coche à afficher. Ive a permis une sélection multiple avec

UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath]; 
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
    thisCell.accessoryType = UITableViewCellAccessoryCheckmark;  
} else {
    thisCell.accessoryType = UITableViewCellAccessoryNone;
} 
[tableView deselectRowAtIndexPath:indexPath animated:NO]; 

Je voudrais les coches à persistaient dans la cellule après la sortie de l'utilisateur. J'ai créé un attribut dans mon entité appelée « contrôle » et il a donné le type de booléen, mais je ne sais pas comment le faire où, si vous frappez une ligne puis un contrôle apparaît et persiste. Toute aide serait grandement appréciée. Merci

Était-ce utile?

La solution

Voici comment je le fais. Un point notable: CoreData ne stocke pas booléens, de sorte que toute propriété portant la mention « booléenne » est en fait de type NSNumber. Vous devez vous rappeler de convertir dans les deux sens lorsqu'ils traitent avec CoreData et les valeurs booléennes.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSManagedObject *selectedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];


    if ([[selectedObject valueForKey:@"isDone"] boolValue]) {
        [selectedObject setValue:[NSNumber numberWithBool:NO] forKey:@"isDone"];
    } else {
        [selectedObject setValue:[NSNumber numberWithBool:YES] forKey:@"isDone"];
    }
}

J'ai mon UITableViewController défini comme délégué pour la NSFetchedResultsController, de sorte que les changements que j'ai fait aux objets gérés dans la requête ^^^ peuplerai les deux méthodes suivantes à exécuter.

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView reloadData];
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:defaultCellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:defaultCellIdentifier] autorelease];
    }

    NSManagedObject *item = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    cell.textLabel.text = [item valueForKey:@"name"];

    if ([[item valueForKey:@"checks"] boolValue]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;
}

Voici comment les liens tout ensemble

  1. L'utilisateur clique sur une ligne
  2. tableView: didSelectRow ... méthode change la propriété "isDone" de l'objet géré approprié
  3. .
  4. les résultats récupérés des avis de contrôleur qu'un objet géré a changé et appelle la méthode controllerDidChangeContent sur son délégué.
  5. Ma méthode de controllerDidChangeContent que toutes les recharge données dans la vue de la table
  6. Lorsque la tableView est rechargée, mon tableView: cellForRow ... méthode vérifie la propriété « isDone » de l'élément a réussi à voir si la cellule doit avoir une coche ou non
  7. .

Et juste pour que vous ne vous trompez pas, je d'abord un NSMangagedObject générique pour stocker l'état rangée, ce qui est la raison pour laquelle la première méthode que je dit posté, [selectedObject valueForKey:@"isDone"]. Plus tard, je suis passé à un objet géré nommé sous-classé JKItem, ce qui explique pourquoi la deuxième série de méthodes est capable d'utiliser item.isDone sans générer un avertissement du compilateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top