Возникает странная ошибка при перезагрузке индекса раздела?

Я использую iPhone SDK и Objective-C, и я получаю это сообщение об ошибке:

Ошибка утверждения в - [UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-984.38/UITableView.m:774 08.01.2010 13: 24: 16.842 MyAPP [628: 20b] Завершение работы приложения из-за неперехваченного исключения 'NSInternalInconsistencyException', причина: 'Недействительное обновление: недопустимое количество строк в разделе 1. Количество строк, содержащихся в существующем разделе после обновления (1), должно быть равно количеству строк, содержащихся в этом разделе до обновления (0), плюс или минус количество строк, вставленных или удаленных из этого раздела (0 вставлено, 0 удалено).

Вот мой код для расширения разделов:

- (void)checkAction:(id)sender
{
    //The button is added as subview on a view and the view is section header custom view
    UIButton *Button = (UIButton*)sender;
    NSLog(@"Button Tag=%d",Button.tag);
    if([[self.MySectionIndexArray objectAtIndex:Button.tag] isEqualToString:@"UP"])
    {
        [self.MySectionIndexArray replaceObjectAtIndex:Button.tag withObject:@"DOWN"];
        [ButtonDrop setBackgroundImage:[UIImage imageNamed:@"Up.png"] forState:UIControlStateNormal];
        [TableDashBoard reloadSections:[NSIndexSet indexSetWithIndex:Button.tag] withRowAnimation:UITableViewRowAnimationFade];
    }
    else
    {
        [self.MySectionIndexArray replaceObjectAtIndex:Button.tag withObject:@"UP"];
        [ButtonDrop setBackgroundImage:[UIImage imageNamed:@"Down.png"] forState:UIControlStateNormal];
    }
    NSLog(@"self.MySectionIndexArray ka title = %@ at index Number=%d",self.MySectionIndexArray,Button.tag);
}

person Rahul Vyas    schedule 08.01.2010    source источник


Ответы (2)


Проблема в том, что вы используете reloadSections при изменении dataSource содержимого таблицы, так что она сообщает другое количество строк через tableView:numberOfRowsInSection:.

Проверьте, что вы возвращаете из своего UITableViewDataSource tableView:numberOfRowsInSection:. Моя ставка заключается в том, что вначале вы возвращаете 0 для раздела 1, но когда вы вызываете reloadSections, вы возвращаете 1 для раздела 1.

Если это действительно так, вы можете использовать UITableView методы beginUpdates, insertRowsAtIndexPaths:withRowAnimation: и endUpdates.

person Adam Woś    schedule 08.01.2010
comment
Я не меняю dataSource. На самом деле, если я использую reloaddata, ошибка не возникает. Я использую расширяющийся код разделов из сообщения stackoverflow. Но я также получаю здесь еще одну странную проблему. Я создал две пользовательские ячейки из Interface Builder. Я хочу показать разделитель под обеими ячейками, поэтому я добавляю к ним серую метку. мое табличное представление В первом разделе я выделяю одну ячейку IB для первой строки и еще для 3 строк я выделяю другую ячейку IB. И для остальной части раздела выделяю ячейки по умолчанию. Но когда я прокручиваю серую метку, превращаемую в белый к этому? - person Rahul Vyas; 08.01.2010
comment
Я имел в виду, что вы изменяете содержимое dataSource - то есть то, что вы возвращаете из tableView:numberOfRowsInSection: - это прямо указывается в сообщении об ошибке, которое у вас есть. - person Adam Woś; 08.01.2010
comment
Кстати, тот факт, что reloadData работает, указывает на то, что мы идем по правильному пути, пытаясь увидеть, что возвращает tableView:numberOfRowsInSection:. Это связано с тем, что при вызове reloadSections табличное представление запрашивает у источника данных новые ячейки для указанных разделов. Табличное представление оживляет вставку новых ячеек, как и старые. А reloadData просто перезагружает данные без какой-либо анимации, и его не следует вызывать в методах, которые вставляют или удаляют строки, особенно в блоке анимации, реализованном с помощью вызовов beginUpdates и endUpdates. - person Adam Woś; 08.01.2010
comment
@ AdamWoś именно ваше подробное объяснение заставило меня понять, что я делаю неправильно, спасибо вам за это! Я не понимал, что совершенно другой раздел вызовет проблемы, когда табличное представление ожидало, что обновления произойдут до того, как произойдет эта анимация. - person kyleturner; 29.01.2013

У меня была аналогичная проблема. Я был уверен, что обновляю источник данных.

Но в конце концов я понял, что на самом деле изменял 2 раздела, но обновлял dataSource только для одного.

person Fede Mika    schedule 17.05.2011
comment
В особом случае, при связывании перезагрузки раздела с KVO, важно, чтобы при перезагрузке одного раздела изменялось только количество строк для этого отдельного раздела. Если что-то произойдет, что повлияет на количество строк для нескольких разделов, то все, что изменилось, следует передать в [reloadSections:withRowAnimation]. - person user3099609; 28.07.2015