J'ai eu des difficultés à trouver des exemples/tutoriels/informations pour cela. J'aimerais avoir un bouton "ajouter aux favoris" dans mon application. cela prendrait une cellule d'une vue de table et peuplerait cette cellule dans la vue de table «favoris». Les données de base sont-elles la bonne direction pour aborder cela? J'ai vu quelques conseils sur l'utilisation de nsmutablearray et/ou nsuserdefaults. pas vraiment sûr de quel chemin aller. tout conseil est apprécié.données de base pour le bouton 'ajouter aux favoris'?
Répondre
Les données de base sont probablement la meilleure solution si vous avez besoin d'un stockage persistant entre les sessions utilisateur. NSUserDefaults est plus pour - juste que - les valeurs par défaut de l'utilisateur. Bien que je pense qu'il serait approprié d'enregistrer, disons, la page d'accueil d'un utilisateur, dans NSUserDefaults, quelque chose qui pourrait devenir grand (comme les favoris) devrait probablement aller dans un magasin de données.
Si vous n'avez jamais besoin de faire une recherche dans la liste et que vous souhaitez simplement l'enregistrer et l'afficher, regardez également les fichiers plist. NSArray peut écrire des données directement dans un fichier plist avec writeToFile:atomically:
. Vous pouvez récupérer ces données avec arrayWithContentsOfFile:
.
Si vous allez à l'approche ci-dessus, une chose à surveiller - arrayWithContentsOfFile:
est une méthode statique, pas une méthode d'instance.
Les données de base sont, cependant, de loin l'option la plus flexible. Essayez l'application modèle dans XCode pour "Application basée sur la navigation" avec "Utiliser les données de base". La plupart du code d'exemple est juste là.
J'ai ajouté cette fonctionnalité à ma vue détaillée. Mon entité a un attribut "favori". En appuyant sur le bouton « favori » dans la vue détaillée définit une chaîne pour l'attribut préféré et permet de basculer d'une image de l'étoile et descendre:
- (IBAction)flagButtonPressed:(id)sender {
if (flagButtonSelected == 0) {
[flagButton setSelected:YES];
flagButtonSelected = 1;
[flagButtonImage setImage:[UIImage imageNamed:@"yesFavorite.png"]];
[myCoolEntity setValue:@"yesFlag" forKey:@"flagSet"];
} else {
[flagButton setSelected:NO];
flagButtonSelected = 0;
[flagButtonImage setImage:[UIImage imageNamed:@"noFavorite.png"]];
[myCoolEntity setValue:@"noFlag" forKey:@"flagSet"];
}
NSManagedObjectContext *context = myCoolEntity.managedObjectContext;
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Tried to save fav. Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
Puis dans mon principale vue de la table, j'ai un bouton favoris dans la barre de navigation qui pousse un nouveau contrôleur de vue avec un NSFetchedResultsController et un prédicat qui recherche toutes les entités dont l'attribut "flagSet" est défini sur "yesFlag".
- (NSFetchedResultsController *)fetchedResultsController {
// Set up the fetched results controller if needed.
if (fetchedResultsController == nil) {
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyCoolEntity" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"flagSet like 'yesFlag'"];
[fetchRequest setPredicate:predicate];
//set batch size
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"name" cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
}
return fetchedResultsController;
}
En outre, dans viewDidLoad pour la vue détaillée que j'affiche l'image de l'étoile sur le bouton Favoris, selon le cas:
//flag button
if ([myCoolEntity.flagSet isEqual:@"yesFlag"]) {
[flagButtonImage setImage:[UIImage imageNamed:@"yesFavorite.png"]];
[flagButton setSelected:YES];
flagButtonSelected = 1;
} else {
[flagButtonImage setImage:[UIImage imageNamed:@"noFavorite.png"]];
[flagButton setSelected:NO];
flagButtonSelected = 0;
}
C'est exactement ce que j'ai pensé à faire, merci pour cet excellent exemple, j'ai cherché partout sur www pour cela. – ingenspor
Si le nombre de favoris est susceptible de rester gérable (disons jusqu'à 100- 200 ou plus), vous feriez probablement mieux d'utiliser l'approche NSUserDefaults
. Dans ce cas, je suggèrerais seulement d'utiliser Core Data si vous avez d'autres besoins. Ce n'est pas trivial d'utiliser les données de base. Stocker les données dans un plist distinct est également une bonne approche raisonnable.
Pour ne pas vous effrayer loin des données de base. C'est génial, et je vous encourage à l'apprendre, mais il se peut que vous soyez excessif si vous l'utilisez pour ce scénario.
Coolbeans. Merci pour le conseil! Je vais certainement plonger dans les données de base. – Chunjai