J'ai une entreprise utativevoller qui est sauvegardée par un NsfetchedResultController.
My NsfetchedResultSluTroller a donné des résultats en deux sections basées sur un booléen. p>
dans un fil de fond, la source de données est modifiée de telle sorte que des lignes soient ajoutées. ou enlevé. J'ai mon NSManagedObjectContext de fil de fond est la fusion correctement et cette situation de travail très bien pour la plupart des cas. Les rangées altéressent lorsque les données sont modifiées et se déplacent entre les sections avec des animations. P>
Il y a une situation cependant où mon application se bloque avec un exc_bad_access.
Le cas est que lorsque la dernière ligne d'une section est déplacée dans l'autre section. (Trace de pile ci-dessous). L'accident se produit dans objc_msgSend mais les conseils de débogage normale J'utilise ne jamais retourner quoi que ce soit utile, je reçois simplement "la valeur ne peut pas être convertie en integer" de Les méthodes NsfetchedResultSlsTrollerDelegate sont appelées dans l'ordre suivant: gdb code>. P>
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [[self.fetchedResultsController sections] count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
4 Réponses :
J'étais super curieux du code qui a corrigé un problème avec l'ajout d'une nouvelle section, donc j'ai décidé de le faire sauter à la place de mes méthodes actuelles NsfetchedResultSultsLsTeleGateGate de NsfetchedResultSultControllerDeleDeleSult. Traçage, j'ai découvert que ce code des "emplacements" de Apple "Emplacements" s'écrase lors de l'utilisation de la NsfetchedResultsController: mais le code suivant fonctionne parfaitement: p> Je n'ai pas de cas où les rubriques de la section changeront, je ne continuerai pas à déboguer pour résoudre le problème du code d'Apple.
J'ai pris un look rapide. Votre projet d'emplacement modifié ne s'est pas écrasé sur moi, mais il a généré des exceptions de données de base. Le problème réalise à recharger les sections du contrôleur: DidChangeObject :. J'ai changé le code comme suit et tout va bien pour moi (y compris les titres de section) sur iOS 4.3 et iOS 5.
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { UITableView *tableView = self.tableView; switch(type) { // other cases here case NSFetchedResultsChangeMove: [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; break; } }
Cela ne résout pas vraiment le problème. Suppression des lignes déplacées et les réinsérer ailleurs ne causent pas la même erreur, mais elle perd également les animations de la ligne.
Je reçois un accident supplémentaire que j'ai supprimé la dernière ligne dans une section.
Assurez-vous que vous avez mis en œuvre Controller: DidChangesection: AttinDex: Forchangetype: strong> Pour gérer la suppression de la section. P> - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
switch(type) {
case NSFetchedResultsChangeInsert:
[self.viewTable insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]
withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.viewTable deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex]
withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
Parce que chaque question a besoin d'une réponse rapide, voici un (basé sur la réponse acceptée de Xjones). Comme c'est le cas avec les autres réponses, la magie est dans le .Move: supprimer et insérer au lieu de déplacer la ligne.
Ceci est mon délégué NSFRC DidChangeObject: P>
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { switch type { case .Delete: if let deletePath = indexPath { self.tableView.deleteRowsAtIndexPaths([deletePath], withRowAnimation: .None) } break case .Insert: if let insertPath = newIndexPath { self.tableView.insertRowsAtIndexPaths([insertPath], withRowAnimation: .Fade) } break case .Update: if let updatePath = indexPath { self.tableView.reloadRowsAtIndexPaths([updatePath], withRowAnimation: .None) } break case .Move: if let indexPath = indexPath, newIndexPath = newIndexPath { self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) self.tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade) } break } }