Salut :) J'ai une question de la même comme dans Working with the same NSManagedObjectContext in multiple tabs
fond:
Mon managedObjectContext (plus MOC) est initialisées dans ma classe appDelegate et passé throught à plusieurs onglets par
myViewController.managedObjectContext = self.managedObjectContext;
ou dans la méthode init avec self.managedObjectContext = pContext;
le flux est: la première vue est une simple liste de collections. Les collections sont récupérées avec un NSFetchedResultsController (myViewController : UITableViewController<NSFetchedResultsControllerDelegate>
). En en sélectionnant un, vous naviguez plus profondément, mais vous passez toujours ce MOC.
Dans le contrôleur suivant (detailsViewController), j'indique certains éléments de cette collection avec lesquels je peux interagir (par exemple, les commutateurs).
J'ai aussi un editingObjectContext:
NSManagedObjectContext ne rafraîchit pas correctement
// DetailsViewController.m
NSManagedObjectContext* editingContext = [[NSManagedObjectContext alloc] init];
[editingContext setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]];
self.editingObjectContext = editingContext;
Maintenant, ma question: parce que mon point de vue doit tourner, je me sers le truc que vous avez choisi:
// DetailsViewController.m
DetailsView *localAct = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ]
DetailsView *localSen = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ]
UITableView *localContainerView = [[UITableView alloc] init];
self.containerView = localContainerView;
[localContainerView release];
//[...]
[containerView addSubview:actuatorView];
self.tableView = containerView;
plus j'ai un bouton pour gérer ces éléments (lequel d'entre eux doit être montré et qui pas). Ce bouton recharge simplement la table avec un nouveau fetchResult.
// DetailsView.m
- (void) manageItems{
managing = !managing;
[viewController setIsManaging:managing]; // parent
self.fetchedResultsController = nil;
NSError *error = nil;
[[self fetchedResultsController] performFetch:&error];
[self reloadData];
[self updateBarButton];
}
La méthode pour mettre les éléments dans le contexte semble si:
// DetailsViewController.m
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// init + create predicate
NSSet* set = [sen filteredSetUsingPredicate:predicate];
if([set count] > 0)
{
for(Act* act in set)
{
[editingObjectContext deleteObject:act];
}
}
else
{
Act* act = [NSEntityDescription insertNewObjectForEntityForName:@"Act" inManagedObjectContext:editingObjectContext];
// do things
}
NSError *error = nil;
[[detailView fetchedResultsController] performFetch:&error];
[self.containerView reloadData];
[detailView reloadData];
}
mais après avoir sélectionné les éléments de la vue gérée et cliqué sur Enregistrer (manageItems), la vue ne les montre pas :/je dois changer l'onglet ou naviguer dans un autre contrôleur (parent ou plus profond) pour l'actualiser. ma méthode viewWillAppear:
// DetailsViewController.m
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
DetailsView *detailView = se ? senView : actView;
// [do uninteresting stuff]
[detailView.fetchedResultsController performFetch:nil];
[self.tableView reloadData];
// [do uninteresting stuff]
}
et viewWillDisapper appelle
- (void)saveChanges
{
if(![editingObjectContext hasChanges])
return;
// send save-command to server
}
Dans un earliert Verison où il n'y avait que 1 vue, il a travaillé et je n'ai pas changé beaucoup ... vraiment:/donc je don Je ne comprends pas pourquoi le MOC agit comme il le fait. La partie « manageItems » est à peu près égale, juste un niveau plus profond dans la nouvelle version (dans le DetailsView au lieu du contrôleur) ...
si quelqu'un peut me dire ce que je peux essayer (économiser toujours au serveur lorsque le commutateur entre la gestion et normal n'est pas une solution parce que le retard dans la réponse du serveur est trop élevé pour l'actualisation, donc j'ai moins pour renverser la vue.Aussi rafraîchir les vues avec self.tableView/detailView/self.containerView refresh apporte le même résultat: /).
et un deuxième problème: Je ne peux pas appeler la méthode "editObjectContext save:" après l'envoi au serveur, car il lance des erreurs et ne sauvegarde pas du tout dans la base de données locale.
Erreur dans handleChangeResponse: "L'opération n'a pas pu être terminée (erreur Cocoa 133020.)" Erreur de domaine = code NSCocoaErrorDomain = 133020 UserInfo = {0x4d8bb90 conflictList = ( « NSMergeConflict (0x5a2fac0) pour NSManagedObject (0x5a46a80) avec objectID '0x5a46420' avec oldVersion = 7 et newVersion = 8 et ancien objet snapshot = {\ n iconName = noicon; \ n [...]; \ n} et nouvelle ligne en cache = {\ n iconName = noicon; \ n [...] \ N} » )}
si vous avez des questions ou besoin de plus code (de l'ancienne version), puis demandez;)
Merci d'avance :)
ok, j'ai trouvé une version qui fonctionne avec le flipview ... déjà copié le code dans le nouveau, mais toujours le même problème ...:/ '- (void) manageItems/* DetailsViewController */ { \t DetailsView * = DetailView issen? senView: actView; \t [detailView manageItems]; } ' --- ' - (void) manageItems // DetailsView { \t gestion de gestion; \t [viewController setIsManaging: gestion];/* Parent */ \t self.fetchedResultsController = nul; \t NSError * error = nil; \t [[auto] fetchedResultsController performFetch: & error]; \t [viewController.containerView reloadData]; \t [self updateBarButton]; } ' – geo