2012-07-04 5 views
0

У меня есть приложение для iPad iOS, где в левой части экрана отображается табличное представление, а справа отображается форма ввода данных. Правая форма ввода данных состоит из другого представления таблицы с UITextFields внутри ячеек.UITableView сбой с reloadRowsAtIndexPaths

Когда определенное текстовое поле изменено, мне нужно изменить соответствующую строку в левой таблице. Я управляю этим, используя уведомления. В большинстве случаев все работает нормально, но иногда приложение падает, когда я пытаюсь обновить конкретную строку в левой таблице.

С левой стороны стола просматривается другой контроллер вида на правый стол.

В правой таблице текстовое поле имеет следующий метод в пределах его зрения контроллера:

-(void)textFieldDidChange:(id)sender 
{ 
    switch (((UIView*)sender).tag) { 
     case TAG_QE_PAGECAPTIONTEXTFIELD: 
      NSLog(@" = = = = = Caption did change %@",((UITextField*)sender).text); 
      [getModelForm() updateCurrentPageCaption:((UITextField*)sender).text forLanguage:@"English"]; 
      [[NSNotificationCenter defaultCenter] postNotificationName: @"pageCaptionWasChanged" object: @"PageEdit"]; 
      break; 

     default: 
      break; 
    } 
} 

ViewController за столом слева устанавливает слушателя для уведомления с помощью следующего кода:

[[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(eventPageCaptionWasChanged:) 
    name: @"pageCaptionWasChanged" 
    object: nil]; 

контроллер вид для таблицы слева, то есть следующий метод:

-(void)eventPageCaptionWasChanged:(id)alteredText 
{ 

    UITableView* tableView = (UITableView*)[ self.view viewWithTag:TAG_QE_PAGELIST_TABLEVIEW ]; 
    int row = (int)getModelForm().currentPageNo; 
    NSLog(@"HPSQuestionnaireEditorController got eventPageCaptionWasChanged with %@ for row %i",alteredText,row); 
    NSIndexPath* indexPath = [NSIndexPath indexPathForRow:row inSection:0]; 
    NSArray* array = [NSArray arrayWithObject:indexPath]; 
    int modelPageCount = getModelForm().pages.count; 
    NSLog(@"eventPageCaptionWasChanged modelPageCount=%i",modelPageCount); 
    [tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationFade]; 

} 

Приложение прерывается с ошибкой на линии [tableView reloadRowsAtIndexPaths. Исключение: отказ * Assertion в - [UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:1037

Может кто-нибудь помочь?

Большое спасибо.

+1

пытаются поставить код в '- (пустоте) eventPageCaptionWasChanged: метод (идентификатор) alteredText' в примерочных поймать блока и распечатать исключения. Я думаю об исключении из заграницы, но его печать даст нам дополнительные подсказки. – George

+0

Отладчик сообщает об исключении как: *** Завершение приложения из-за неотображенного исключения «NSInternalInconsistencyException», причина: «попытаться удалить строку 2 из раздела 0, которая содержит только две строки перед обновлением». – whatdoesitallmean

ответ

1

Кажется, номера страниц начинаются с 1, но индексы таблицы начинаются с нуля, поэтому, когда вы ищете строку с номером 2, таблица фактически ищет третий элемент, т.е. 0,1,2, и поэтому получает исключение из-за пределов.

Самый простой способ исправить это - изменить эту линию.

int row = (int)getModelForm().currentPageNo; 

к этому

int row = (int)getModelForm().currentPageNo -1; 
+0

Большое спасибо за ответ. Это похоже на эту проблему, но на самом деле это не проблема индексирования (всегда есть добавленная первая строка в таблицу). Кроме того, проблема прерывистая и случается только иногда. Это нормально (и таблица выглядит одинаково), если я использую reloadData, но не пытаюсь обновить только одну строку. – whatdoesitallmean

+0

Сообщение об ошибке сообщает вам, что индекс строки 2 пытается быть удален, а самый большой индекс равен 1 (есть 2 строки). Ваше приложение, вероятно, всегда разрушается при попытке удалить последнюю строку. Исправление индексации должно решить проблему. Также вы можете конвертировать в современный obj-c для инициализации массива и т. Д. Это гораздо более сжато. – allprog

+0

Чтобы подтвердить удаление правой строки, убедитесь, что элементы разные. Удаление из «item, item, item» не будет раскрывать такие проблемы. «item1, item2, item3» намного лучше для этого. – allprog

Смежные вопросы