Hoffentlich ist dies eine schnelle Lösung. Ich habe versucht, den Fehler herauszufinden, den ich immer wieder bekomme. Der Fehler ist unten aufgeführt und die 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 einer nicht erfassten Ausnahme 'NSInternalInconsistencyException
' , Grund: 'Ungültige Aktualisierung: Ungültige Anzahl von Zeilen in Abschnitt 0. Die Anzahl der Zeilen, die in einem vorhandenen Abschnitt nach der Aktualisierung enthalten sind (2), muss der Anzahl der Zeilen entsprechen, die in diesem Abschnitt vor der Aktualisierung enthalten sind (2), plus oder abzüglich der Anzahl der in diesen Abschnitt eingefügten oder gelöschten Zeilen (1 eingefügt, 0 gelöscht) und plus oder minus der Anzahl der in diesen Abschnitt oder aus diesem Abschnitt verschobenen Zeilen (0 eingezogen, 0 ausgezogen). "
#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
quelle
Antworten:
Ich sehe keinen Grund für Sie, uns diesen Teil des Codes zu zeigen. Ihr Fehler muss mit diesem Teil in Ihrem Code verbunden sein, nehme ich an
Wahrscheinlich machen Sie einen Fehler bei einer dieser Datenquellenmethoden. Derzeit ist es unmöglich zu sagen, was genau falsch ist, aber ich gehe davon aus, dass es ungefähr so aussehen könnte: Sie sagen der Tabellenansicht
numberOfRowsInSection
, dass Sie n Zeilen reservieren und einrichten möchten und dasscellForRowAtIndexPath
Sie dann beispielsweise nur n - 1 Zeilen behandeln.Entschuldigung, dass diese Antwort nicht so präzise sein kann, wie sie sein sollte. Wenn Sie uns Ihre Implementierung Ihrer Datenquelle zeigen, ist es viel einfacher zu sagen, was los ist.
quelle
Wie Sun Tzu sagte : Es ist am besten, ohne zu kämpfen zu gewinnen . In meinem Fall, wenn ich diese Art von Fehlermeldung sehe (dh Diskrepanz zwischen hinzugefügten, gelöschten Zeilen usw.). Ich debugge nicht einmal etwas. Ich vermeide einfach diesen zusätzlichen Aufruf, bei dem ich die Zeilen neu lade usw. 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 es hat einUITableView
, wenn ich auf eine Zeile klicke, wird ein neues gesendetUITableView
und so weiter. Dieser Fehler tritt immer zu mir , als ich die letzten PopUITableview
und die zurückgehen ,UITableView
bevor es an dieser Stelle ich zur einem unnötigen Anruf -loadIt
Funktion , die im Grunde die Zeilen einfügt und relaods dieUITableView
.Der Grund , warum dies passiert ist , weil ich meine loadit Funktion fälschlicherweise setzen in
viewDidAppear:animated
stattviewDidLoad
.viewDidAppear:animated
wird jedes Mal aufgerufen, wenn dasUITableView
angezeigt wird,viewDidLoad
wird nur einmal aufgerufen.quelle
Denken Sie beim Entfernen von Zeilen daran, dass beim Aktualisieren auch Abschnitte überprüft werden:
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).
quelle
Vergessen Sie nicht, Ihr Array zu aktualisieren, das numberOfRowsInSection bestimmt. Es muss aktualisiert werden, bevor Sie animieren und entfernen
Wir prüfen, ob die Anzahl der Zeilen im Abschnitt 1 ist, da wir den gesamten Abschnitt löschen müssen.
Korrigieren Sie mich, wenn jemand diese Antwort klarer machen kann.
quelle
Ich habe jedes Abschnittselement in separate Arrays eingefügt. Fügen Sie sie dann in ein anderes Array (arrayWithArray) ein. Meine Lösung hier für dieses Problem:
quelle
Ich hatte den gleichen Fehler.
Ich habe die folgenden Zeilen verwendet
um die Feder in der viewDidLoad-Methode zu registrieren, da ich eine andere Feder hatte, die ebenfalls derselben Klasse zugeordnet war. Daher die Linie
gab nil zurück, es sei denn, ich habe die Feder in viewDidLoad registriert.
Mein Problem war, dass ich vergessen habe, den Bezeichner im Attributinspektor für meine Dateien "CustomNib.xib" und "CustomNib ~ iphone.xib" festzulegen. (Oder genauer gesagt, ich habe vergessen, die Eingabetaste zu drücken, nachdem ich den Bezeichner im Attributinspektor in XCode eingegeben habe, sodass der neue Name nicht gespeichert werden konnte.)
Hoffe das hilft.
quelle
Wenn Sie ein
NSFetchedResultsController
Like wie ich verwenden und Daten in einem Hintergrundthread aktualisieren, vergessen Sie nicht, Aktualisierungen im Delegaten zu beginnen und zu beenden:quelle
Ich hatte den gleichen Fehler, der beim Ausprobieren gut
[tableView reloadData]
funktionierte. Der Fehler war tatsächlich in der LeitungAls ich versuchte, die indexPath-Werte zu überprüfen, waren sie nicht wie erforderlich korrekt.
Ich habe es behoben, indem ich Werte in geändert habe
indexPathsArray
.Hoffe das hilft .
quelle
Es könnte eine der
UITableViewDataSource
Protokollmethoden seinZum
es sollte eine ganze Zahl zurückgeben, die der Summe oder dem Ergebnis von entspricht
-insertRowsAtIndexPaths:withRowAnimation:
und / oder-deleteRowsAtIndexPaths:withRowAnimation
:Zum
es sollte eine ganze Zahl zurückgeben, die der Summe oder dem Ergebnis von entspricht
-insertRowsAtIndexPaths:withRowAnimation:
und / oder-deleteSections:withRowAnimation:
quelle
Ich hatte das gleiche Problem mit einer Kerndatenbank. Wenn Sie viele FRC verwenden, müssen Sie nur die Tabellenansicht in jeder Bedingung in numberOfSectionsInTableView neu laden.
quelle
Dies ist mir gerade passiert, als ich Swift und einen von FRC unterstützten Datenspeicher zum Verwalten von Informationen verwendet habe. Durch Hinzufügen einer einfachen Prüfung zum Löschvorgang zur Auswertung des aktuellen indexPath.section konnte ich einen externen 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 einem Off-by-One-Problem, da es eine Faux-Reihe gibt.
Meine Lösung
quelle
Überprüfen Sie einfach, ob Sie [yourTableView reloadData] aufrufen. nach dem Ändern des Array von Werten.
quelle