10
votes

Crash sur UitailView EndUpdates lors du déplacement de la dernière ligne de la section

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 gdb code>. P>

Les méthodes NsfetchedResultSlsTrollerDelegate sont appelées dans l'ordre suivant:

- (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];
}


0 commentaires

4 Réponses :


4
votes

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: xxx

mais le code suivant fonctionne parfaitement: xxx

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.


0 commentaires

6
votes

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;
    }
}


1 commentaires

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.



0
votes

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;
    }
}


0 commentaires

1
votes

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
    }
}


0 commentaires