89 votes

L'échec d'Assertion dans -[UITableView _endCellAnimationsWithContext:]

J'espère que ce sera une solution rapide. J'ai été à essayer de comprendre l'erreur que je reçois. L'erreur est répertorié ci-dessous et le appdelagate est en dessous.

Toute aide est appréciée.

Merci

2012-04-12 21:11:52.669 Chanda[75100:f803] --- l'échec d'Assertion en -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:1037 2012-04-12 21:11:52.671 Chanda[75100:f803] --- la Résiliation d'application en raison de uncaught exception 'NSInternalInconsistencyException', la raison: 'mise à jour incorrecte: non valides nombre de lignes dans la section 0. Le nombre de lignes contenues dans une section existante après la mise à jour (2) doit être égal au nombre de lignes contenues dans cette section avant la mise à jour (2), plus ou moins le nombre de lignes insérées ou supprimées à partir de cette section (1 inséré, 0 supprimés) et plus ou moins le nombre de lignes déplacées dans ou hors de la section (0 déplacé, 0).'

#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize databaseName,databasePath; 

- (BOOL)application: (UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions {
    self.databaseName = @"Customers.db";

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDir = [documentPaths objectAtIndex:0];
    self.databasePath = [documentDir stringByAppendingPathComponent:self.databaseName];
    [self createAndCheckDatabase];

    return YES;
}

- (void)createAndCheckDatabase {
    BOOL success;

    NSFileManager *fileManager = [NSFileManager defaultManager];
    success = [fileManager fileExistsAtPath:databasePath];

    if (success) return; 

    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:self.databaseName];

    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
}

@end

43voto

pbx Points 891

Je ne vois pas de raison pour vous de nous montrer cette partie de code. Votre erreur doit être connectée à une partie de votre code, je suppose

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

Probablement vous faites une erreur dans l'un de ces données méthodes de source. Actuellement, il est impossible de dire quel est exactement le problème, mais je suppose que ça pourrait être quelque chose comme: Vous demandez à la vue de la table dans l' numberOfRowsInSection aimeriez-vous avoir des n lignes réservées et l'installation et à l' cellForRowAtIndexPath vous ensuite de gérer uniquement n - 1 lignes par exemple.

Désolé que cette réponse ne peut pas être aussi précis qu'il devrait être. Si vous nous montrez votre mise en œuvre de votre source de données, il serait beaucoup plus facile de dire ce qu'il se passe.

26voto

abbood Points 5959

Comme Sun Tzu dit: il est préférable de gagner sans combattre. Dans mon cas, à chaque fois que je vois ce genre de message d'erreur (c'est à dire la contradiction entre les lignes ajoutées supprimés etc).. je n'ai même pas de débogage de rien.. j'ai simplement éviter de faire de ce surplus d'appel où j'ai recharger les lignes etc.. c'est 99% des cas où cette erreur se produit.

C'est un scénario courant lorsque ce bug se produit: j'ai un UINavigationController et il a un UITableView, lorsque je clique sur une ligne, elle pousse un nouveau UITableView et ainsi de suite. Cette erreur arrive toujours à moi quand je pop le dernier UITableview et revenir à l' UITableView avant elle, à ce point, je fais inutile de faire appel à l' loadIt fonction qui, fondamentalement, insère les lignes et relaods l' UITableView.

La raison à cela est parce que j'ai tort de placer ma loadIt fonction en viewDidAppear:animated plutôt que d' viewDidLoad. viewDidAppear:animated est appelée chaque fois que l' UITableView est affiché, viewDidLoad n'est appelée qu'une seule fois.

24voto

Olof_t Points 254

Lors de la suppression de lignes, rappelez-vous qu'il vérifie également les sections lors de la mise à jour, dans:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView

Si vous souhaitez supprimer une ligne qui est le dernier élément dans une section, vous devez supprimer l'ensemble de la section à la place (sinon il pourrait obtenir de l'article comte de mal et de se débarrasser de cette exception).

4voto

Khwarezm Shah Points 426

J'ai mis chaque section éléments séparés tableaux. Puis les mettre dans un autre array( arrayWithArray). Ma solution pour ce problème:

[quarantineMessages removeObject : message];
[_tableView beginUpdates];
if([[arrayWithArray objectAtIndex: indPath.section] count]  > 1)
{
    [_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indPath] withRowAnimation:UITableViewRowAnimationBottom];
}
else
{
    [_tableView deleteSections:[NSIndexSet indexSetWithIndex:indPath.section]
              withRowAnimation:UITableViewRowAnimationFade];
}
[_tableView endUpdates];

2voto

user1612868 Points 141

J'ai eu le même message d'erreur.

J'ai été en utilisant les lignes suivantes

UINib *myCustomCellNib = [UINib nibWithNibName:@"CustomNib" bundle:nil];
[tableView registerNib:myCustomCellNib forCellReuseIdentifier:@"CustomNib"];

pour enregistrer la plume dans la méthode viewDidLoad, depuis que j'ai eu une autre plume qui a également été associée avec la même classe. Par conséquent, la ligne de

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"GBFBLoadingCell"];

était de retour nul, sauf si je me suis inscrit à la plume dans le viewDidLoad.

Mon problème est que j'ai oublié de définir l'identifiant dans les attributs de l'inspecteur de mon fichier "CustomNib.xib" et "CustomNib~iphone.xib". (Ou, plus précisément, que j'ai oublié d'appuyer sur entrée après avoir saisi l'identifiant de l'attribut de l'inspecteur dans XCode, de sorte que le nouveau nom a échoué à enregistrer).

Espérons que cette aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X