2017-10-30 5 views
1

Ich stehe vor einem Absturz Problem beim Einfügen einer Zeile in die Tabellenansicht.Dies passiert, wenn Seitenumbruch neu geladen (Sehr schnelles Scrollen von Tabellenansicht) Tabellenansicht und Einfügen von Zeile für Anzeigen passiert fast ähnliche Zeit.Zeile einfügen und neu laden in uitableview

Ad Methode Einfügen

[self.news insertObject:adStory atIndex:index]; 
NSArray *paths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]]; 
[[self tableView] beginUpdates]; 
[[self tableView] insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade]; 
[[self tableView] endUpdates]; 

OperationDidfinish

[_tableView relaoddata]; 

Crash-Logs

*** App abgefangene Ausnahme 'NSInternalInconsistencyException', Grund beenden wegen: ‚Ungültige Update: ungültige Anzahl von Zeilen in Abschnitt 0. Die Anzahl der Zeilen in einem vorhandenen Abschnitt nach der Aktualisierung (45) muss gleich der Anzahl der Zeilen in diesem Abschnitt sein vor dem Update (43), plus oder minus der Anzahl der Zeilen eingefügt oder gelöscht von diesem Abschnitt (1 eingefügt, 0 gelöscht) und plus oder minus die Anzahl der Zeilen in oder aus diesem Abschnitt (0 bewegt, bewegt, bewegte sich heraus)).

*** First throw call stack: 
    (0 CoreFoundation      0x000000010e8ebb0b __exceptionPreprocess + 171 

1 libobjc.A.dylib      0x000000010e357141 objc_exception_throw + 48 

2 CoreFoundation      0x000000010e8efcf2 +[NSException raise:format:arguments:] + 98 
3 Foundation       0x00000001088413b6 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193 
4 UIKit        0x000000010c8d78e8 -[UITableView _endCellAnimationsWithContext:] + 16362 
5 UIKit        0x000000010c8ee9cc -[UITableView _updateRowsAtIndexPaths:updateAction:withRowAnimation:] + 329 
+1

Bitte einige Crash-Protokolle veröffentlichen. –

+0

hinzugefügt das crash log.please check – Angel

+0

Was ist 'relaodata'? Im Grunde rufen Sie nicht 'insertRows ...'/'deleteRows ...' und 'reloadData' gleichzeitig auf. 'insertRows ...' aktualisiert die Benutzeroberfläche. Und 'beginUpdates/endUpdates' hat keine Auswirkungen, wenn eine einzelne 'Einfügen/Löschen/Verschieben'-Operation ausgeführt wird. – vadian

Antwort

0

Bitte stellen Sie sicher, dass Anzahl der Zeilen in der Delegate-Methode zurück - (NSInteger)numberOfRowsInSection:(NSInteger)section; ist äquivalent zu der, nachdem Sie insertRowsAtIndexPaths und endUpdates. Wenn z. B. numberOfRows 4 ist und Sie eine Zeile einfügen, sollte numberOfRows 4 + 1 zurückgeben. Andernfalls wird es in EndUpdate nicht übereinstimmen.

Das folgende Crash-Protokoll beschreibt das nur.

*** app Abschluss aufgrund abgefangene Ausnahme ‚NSInternalInconsistencyException‘, Grund: ‚Ungültige Update: ungültige Anzahl von Zeilen in Abschnitt 0. Die Anzahl der Zeilen in einem vorhandenen Abschnitt nach dem Update enthalten ist (45) muß gleich der Anzahl der Zeilen in diesem Abschnitt vor der Aktualisierung (43), plus oder minus der Anzahl der Zeilen eingefügt oder gelöscht aus diesem Abschnitt (1 eingefügt, 0 gelöscht) und plus oder minus der Anzahl der Zeilen in oder aus bewegt dieser Abschnitt (0 eingezogen, 0 ausgezogen). '

+1

Ja. Das war das Problem. Ich habe es versäumt, auf die Anzahl der Anzeigen zu achten, während ich zusätzliche Ladezellen hinzufügte. – Angel

0

Alle UI-bezogenen Änderungen müssen unter main thread ausgeführt werden. Wenn Sie Änderungen an der Benutzeroberfläche auf der background thread vornehmen, kann dies zu einer Verlangsamung der Änderungen führen.

die Sie interessieren,

dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.news insertObject:adStory atIndex:index]; 
     NSArray *paths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]]; 
     [[self tableView] beginUpdates]; 
     [[self tableView] insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade]; 
     [[self tableView] endUpdates]; 
    }); 

Diese Pflege nehmen die Änderungen an main thread bei Bedarf zu bewegen.

Verwandte Themen