it-swarm.com.de

Assertionsfehler in - [UITableView _endCellAnimationsWithContext:]

Hoffentlich wird dies eine schnelle Lösung sein. Ich habe versucht, den Fehler herauszufinden, den ich immer wieder bekomme. Der Fehler ist unten aufgeführt und das Appdelagate ist darunter.

Jede Hilfe wird geschätzt.

Vielen Dank

2012-04-12 21: 11: 52.669 Chanda [75100: f803] --- Assertionsfehler in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:1037 2012-04-12 21: 11: 52.671 Chanda [75100: f803] --- Beenden der App aufgrund der nicht erfassten Ausnahme 'NSInternalInconsistencyException', Grund: 'Ungültige Aktualisierung: Ungültige Anzahl von Zeilen in Abschnitt 0. Anzahl der Zeilen in einer Bestehender Abschnitt nach der Aktualisierung (2) muss der Anzahl der in diesem Abschnitt enthaltenen Zeilen vor der Aktualisierung (2) entsprechen, zuzüglich oder abzüglich der Anzahl der Zeilen, die in diesem Abschnitt eingefügt oder gelöscht wurden (1 eingefügt, 0 gelöscht) und plus oder minus die Anzahl der Zeilen, die in diesen Abschnitt hinein oder aus diesem verschoben werden (0 wird hineingezogen, 0 wird ausgefahren). '

#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
86
Scubadivingfool

Ich sehe keinen Grund, warum Sie uns diesen Teil des Codes zeigen. Ich nehme an, Ihr Fehler muss mit diesem Teil in Ihrem Code verbunden sein

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

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

Möglicherweise machen Sie einen Fehler in einer dieser Datenquellenmethoden. Momentan ist es unmöglich zu sagen, was genau falsch ist, aber ich gehe davon aus, dass es in etwa so aussehen könnte: Sie sagen der Tabellenansicht in der numberOfRowsInSection Sie möchten n Zeilen reserviert und eingerichtet und in der cellForRowAtIndexPath Sie dann nur behandelt beispielsweise n - 1 Zeilen.

Entschuldigung, dass diese Antwort nicht so genau sein kann, wie sie sein sollte. Wenn Sie uns Ihre Implementierung Ihrer Datenquelle zeigen, ist es viel einfacher zu erkennen, was los ist.

42
pbx

Wie Sun Tzu sagte : es ist am besten zu gewinnen, ohne zu kämpfen. In meinem Fall, wenn ich diese Art von Fehlermeldung sehe (dh Diskrepanz zwischen den Zeilen, die gelöscht wurden usw.), debugiere ich gar nichts. Ich vermeide einfach den zusätzlichen Aufruf, bei dem ich die Zeilen neu geladen habe. Das sind 99% von die Fälle, in denen dieser Fehler auftritt.

Dies ist ein häufiges Szenario, in dem dieser Fehler auftritt: Ich habe ein UINavigationController und ein UITableView. Wenn ich auf eine Zeile klicke, wird ein neues UITableView und so weiter angezeigt. Dieser Fehler tritt immer dann auf, wenn ich die letzte UITableview-Datei anhebe und zur UITableView-Datei zurückspringe. An dieser Stelle rufe ich die loadIt-Funktion unnötig auf, die im Wesentlichen die Zeilen einfügt und die UITableView-Anweisung ersetzt. 

Der Grund dafür ist, dass ich meine loadIt-Funktion fälschlicherweise in viewDidAppear:animated und nicht in viewDidLoad platziere. viewDidAppear:animated wird bei jeder Anzeige von UITableView aufgerufen, viewDidLoad wird nur einmal aufgerufen.

26
abbood

Beachten Sie beim Entfernen von Zeilen, dass beim Aktualisieren auch Abschnitte überprüft werden.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView

Wenn Sie eine Zeile entfernen möchten, die das letzte Element in einem Abschnitt ist, müssen Sie stattdessen den gesamten Abschnitt entfernen (andernfalls kann die Anzahl der Abschnitte falsch sein und diese Ausnahme auslösen).

24
Olof_t

Vergessen Sie nicht, Ihr Array zu aktualisieren, um numberOfRowsInSection festzulegen. Es muss vor dem Animieren und Entfernen aktualisiert werden

Wir prüfen, ob die Anzahl der Zeilen in Abschnitt 1 ist, da der gesamte Abschnitt gelöscht werden muss.

Korrigieren Sie mich, wenn jemand diese Antwort klarer machen kann.

[self.tableView beginUpdates];
if ([tableView numberOfRowsInSection:indexPath.section] == 1) {

   [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade];
} else {

   [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}
[self.tableView endUpdates];
6
love2script12

Ich stelle die einzelnen Abschnittselemente in getrennten Arrays ein. Legen Sie sie dann in ein anderes Array (arrayWithArray). Meine Lösung hier für dieses Problem:

[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];
4
Khwarezm Shah

Ich hatte den gleichen Fehler, der beim Versuch mit [tableView reloadData] einwandfrei funktionierte. Der Fehler war tatsächlich in der Zeile 

[TabView insertRowsAtIndexPaths:indexPathsArray withRowAnimation:UITableViewRowAnimationRight];

Als ich versuchte, die indexPath-Werte zu überprüfen, waren sie nicht korrekt. 

Ich habe es durch Ändern von Werten in indexPathsArray behoben.

Hoffe das hilft .

2
user5553647

Ich hatte den gleichen Fehler.

Ich habe die folgenden Zeilen verwendet

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

um die Spitze in der viewDidLoad-Methode zu registrieren, da ich eine andere Spitze hatte, die auch derselben Klasse zugeordnet war. Daher die Linie

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

wurde zurückgegeben, es sei denn, ich habe die Spitze im viewDidLoad registriert.

Mein Problem war, dass ich vergessen habe, den Bezeichner im Attribut-Inspector für meine Dateien "CustomNib.xib" und "CustomNib ~ iphone.xib" festzulegen. (Oder genauer: Ich habe vergessen, die Eingabetaste zu drücken, nachdem der Bezeichner im Attribut-Inspector in XCode eingegeben wurde, sodass der neue Name nicht gespeichert werden konnte.)

Hoffe das hilft.

2
user1612868

Wenn Sie eine NSFetchedResultsController wie mich verwenden und Daten in einem Hintergrund-Thread aktualisieren, vergessen Sie nicht, Aktualisierungen im Delegaten zu beginnen und zu beenden:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];
}
1
mikeho

Es könnte eine der UITableViewDataSource Protokollmethoden sein

Zum 

- tableView:numberOfRowsInSection:

es sollte eine ganze Zahl zurückgegeben werden, die der Summe oder dem Ergebnis von entspricht 

-insertRowsAtIndexPaths:withRowAnimation: und/oder -deleteRowsAtIndexPaths:withRowAnimation:

For

- numberOfSectionsInTableView:

es sollte eine ganze Zahl zurückgegeben werden, die der Summe oder dem Ergebnis von entspricht 

-insertRowsAtIndexPaths:withRowAnimation: und/oder -deleteSections:withRowAnimation:

1
Ted

Ich hatte das gleiche Problem mit einer Core-Datenbank. Wenn Sie viele FRC verwenden, müssen Sie lediglich die Tabellenansicht in jede Bedingung in numberOfSectionsInTableView neu laden. 

0

Ich hatte gerade die Gelegenheit, während ich Swift und einen FRC-gestützten Datenspeicher zum Verwalten von Informationen verwendete. Durch das Hinzufügen einer einfachen Prüfung zur Löschoperation, um die aktuelle indexPath.section auszuwerten, konnte ich einen überflüssigen Aufruf vermeiden. Ich glaube, ich verstehe, warum dieses Problem auftritt ... Grundsätzlich lade ich eine Nachricht in die oberste Zeile, wenn mein Datensatz leer ist. Dies führt zu einer Ausgabe um eins, da es eine falsche Zeile gibt.

Meine Lösung

... delete my entity, save the datastore and call reloadData on tableView
//next I add this simple check to avoid calling deleteRows when the system (wrongly) determines that there is no section.

       if indexPath.section > 0 {

        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .None)

            }
0
Tommie C.

Überprüfen Sie einfach, ob Sie [IhreTableView-ReloadData] aufrufen. nach dem Array der Werte ändern.

0
Evgeniy Kleban