Удаление объектов из UITableView - PullRequest
0 голосов
/ 28 декабря 2011

Итак, я видел похожие темы, но я не совсем понимаю, почему я до сих пор сбой ...

Я читаю записи в массив, который называется «записи». Через некоторое время я хочу добавить новые записи, а затем удалить старые.

Таким образом, я по существу добавляю материал к «записям», а затем хочу удалить некоторые старые записи. Затем я запускаю приведенный ниже метод и умираю, когда он начинает редактировать представление. Ошибка публикуется под блоком кода.

Спасибо за помощь!

-(void) removeOldEntries:  (int) numOfEntries
{

    NSMutableArray *deleteIndexPaths = [[NSMutableArray alloc] init] ;

 //  Remove the first number of entries in the table view.  This number is specified by the numOfEntries
 for (int i = numOfEntries - 1; i >= 0; i = i -1 )
 {
     [entries removeObjectAtIndex:i];
 }

//  Build deleteIndexPaths
for (int i = numOfEntries - 1; i >= 0; i = i - 1)
{
    //  Add objects to our index pathes array (of things we need to delete) and then remove the objects from feeds array
    [deleteIndexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]];
}

//  Start the editing of the TableView
[self.tableView beginUpdates];
[self.tableView deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
//  End the editing of the table view
[deleteIndexPaths removeAllObjects];
[deleteIndexPaths release]; 
}

Сообщение об ошибке:

 *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1447.6.4/UITableView.m:976
2011-12-27 22:43:04.490 v1.0[999:6003] *** 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 (8) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted).'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00e3dbe9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x00f925c2 objc_exception_throw + 47
    2   CoreFoundation                      0x00df6628 +[NSException raise:format:arguments:] + 136
    3   Foundation                          0x000d847b -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
    4   UIKit                               0x0035aa0f -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 8424
    5   UIKit                               0x0034a433 -[UITableView endUpdates] + 42
    6   v1.0                                0x000050e6 -[NewsTableViewController removeOldArticles:] + 408
    7   v1.0                                0x00004d16 -[NewsTableViewController pullAndParseData] + 696
    8   CoreFoundation                      0x00dae67d __invoking___ + 29
    9   CoreFoundation                      0x00dae551 -[NSInvocation invoke] + 145
    10  Foundation                          0x000ff555 -[NSInvocationOperation main] + 51
    11  Foundation                          0x0006dbd2 -[__NSOperationInternal start] + 747
    12  Foundation                          0x0006d826 ____startOperations_block_invoke_2 + 106
    13  libSystem.B.dylib                   0x96653a24 _dispatch_call_block_and_release + 16
    14  libSystem.B.dylib                   0x96645cf2 _dispatch_worker_thread2 + 228
    15  libSystem.B.dylib                   0x96645781 _pthread_wqthread + 390
    16  libSystem.B.dylib                   0x966455c6 start_wqthread + 30
)
terminate called after throwing an instance of 'NSException'

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Вы делаете это излишне сложным.В вашем удалении есть некоторые несоответствия, поэтому возникает ошибка.Убедитесь в

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    //return for section 0
    return [entries count];
}

и измените свой removeOldEntries: на

-(void) removeOldEntries:  (int) numOfEntries
{

[entries removeObjectsInRange:NSMakeRange(0, numOfEntries-1)];
[self.tableView reloadData];
}
2 голосов
/ 28 декабря 2011

Используйте [_tableView reloadData]. Это упростит вашу жизнь.

Кстати, исключение, которое вы получаете, указывает на то, что ваш массив не содержит того, что, по вашему мнению, должно быть. Попытка NSLog получить ваш массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...