/ / Изтриване и добавяне на UITableView Row - цел-c, uitableview, ios7

Изтриване и добавяне на UITableView Row - цел-c, uitableview, ios7

В моята кандидатура имам UITableView, който посочвам - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section да има 150 реда. Сега, моят източник на данни NSArray има повече от 150 елемента, така че, както се очакваше, в таблицата ми са показани първите 150. Направих също така - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath така че потребителят може да изтрие елементи отUITableView. Това, което искам да се случи, когато даден потребител е изтрил ред, е изтритият ред да изчезне (с анимация), след това останалите редове да се плъзгат нагоре и 151-ият елемент на масива на източника на данни, който преди това не беше показан, за да се покаже като последния елемент на таблицата. Обаче всичко, което опитах досега, ми даде следната грешка:

Terminating app due to uncaught exception "NSInternalInconsistencyException", reason: "Invalid update: invalid number of rows in section 0.  The number of rows contained in an existing section after the update (150) must be equal to the number of rows contained in that section before the update (150), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out)."
First throw call stack:
(0x2e58fecb 0x38d2ace7 0x2e58fd9d 0x2ef3de2f 0x30f94761 0x30ff0f7f 0x2af0f49 0xdf763 0x30fba567 0x30fba4f9 0x30df66a7 0x30df6643 0x30df6613 0x30de1d5b 0x30df605b 0x30db9521 0x30df1305 0x30df0c2b 0x30dc5e55 0x30dc4521 0x2e55afaf 0x2e55a477 0x2e558c67 0x2e4c3729 0x2e4c350b 0x334326d3 0x30e24871 0x106b59 0x39228ab7)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)

Следният код обяснява същността на начина, по който се опитвам да го приложа:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {

PNObject *objectToDelete = contentArray[indexPath.row];
NSMutableArray *mutableCopy = [contentArray mutableCopy];
[mutableCopy removeObject:objectToDelete];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
}

Отговори:

1 за отговор № 1

Не знам дали все още има съответен партньор,
Но това, което мисля, че се случва е, че всъщност не актуализирате източника на данни.

Създавате "локално" копие от източника на данни, което може да се промени, и премахвате обекта в това копие, но истинският източник на данни остава същият и все още съдържа елемента, който премахвате.

Аз предполагам, че вашият numberOfRows:inSection: съдържа някои вариации на [contentArray count]

Така че това, което се случва, е, че "премахвате" елемент от табличния изглед, така че приложението ви изключва, че в табличния изглед има по-малко елемент,
Но при презареждане на съдържанието на таблицата, тъй като елементът не е премахнат от източника на данни, таблицата има още един елемент, отколкото се очаква.

За да разрешите това, променете contentArray на NSMutableArray,
И в горния си код премахнете objectToDelete директно от там.
След това можете също така да премахнете обекта директно от масива, без да създавате локална справка за него. Така че вашият по-горе код трябва да изглежда така:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {

[contentArray removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
}