Ich arbeite daran, einen bestehenden, schwerfälligen Code zu ändern, der einfach die [tableView reloadData]
bei jeder Änderung, bis hin zur Verwendung spezifischerer Tabellenaktualisierungen mit den Insert/Delete-Methoden.
Allerdings habe ich dabei ein wirklich schlechtes Verhalten. Bisher wurden, wie man sich vorstellen kann, beim Laden der Tabelle nur Zellen für die Zeilen angefordert, die zu diesem Zeitpunkt sichtbar waren. Dies war das Verhalten, wenn reloadData
verwendet wurde.
Nun, da insertSections
aufgerufen wird, 何れも Zellen nach dieser Aktualisierung angefordert werden, was Hunderte sein können. Dies führt dazu, dass Zellen für jede Zeile erstellt werden, was die Warteschlange für wiederverwendbare Zellen völlig ruiniert und einfach nur verschwenderisch ist. I doit etwas falsch machen.
Die Änderung ist dieser einfache Code, der dazu führt, dass die tableView nur nach sichtbaren Zeilen fragt:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
// ... ensure it's the right key
[tableView reloadData];
}
Code, der dazu führt, dass die tableView nach allem fragt:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
// ... ensure it's the right key
NSUInteger sectionCount = [self sectionCount];
NSIndexSet *indices = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)];
[tableView insertSections:indices withRowAnimation:UITableViewRowAnimationFade];
}
Ich kann hin und her schalten, um zu sehen, wie sich das Verhalten ändert. Frustrierend. Haben Sie eine Idee?
Ich setze ein Kopfgeld aus, nur um zu sehen, ob jemand weitere Erkenntnisse hat.
Die beginUpdates/endUpdates beeinflussen nichts, und ich würde nicht erwarten, dass es, dies ist nur ein Befehl, es gibt nichts extra zu einer einzigen Aktualisierung zu verschmelzen.
Ich denke, das ist einfach ein Nebeneffekt des Wunsches nach der Animation. Um alles "einschieben" zu können, muss es alles gerendert werden. Game over.