2012-04-04 4 views
4

У меня возникли проблемы с добавлением новой строки в мой UITableView. Я читал подобные вопросы о stackoverflow, искал его, ... не помог мне.NSInternalInconsistencyException при добавлении строки в UITableView

У меня есть пустой NSMutableArray * dataForList с данными для UITableView. После щелчка на экране я хочу добавить новую строку. Эта ошибка показывает:

* Нагрузочного приложение из-за неперехваченное исключение «NSInternalInconsistencyException», причина: «попытка вставить строку 0 в раздел 0, но есть только 0 строк в разделе 0 после обновления»

Код:

NSArray *insertIndexPaths = [NSArray arrayWithObject: 
          [NSIndexPath indexPathForRow: 
           [self.dataForList count] // is zero now 
           inSection:0]]; 

[self.dataForList addObject:newRow]; 
// [self.dataForList count] is 1 now 

[self.unsignedTableView beginUpdates]; 
[self.unsignedTableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationNone]; 
[self.unsignedTableView endUpdates]; // on this line error ocours 

Что мне не хватает?

методы Все UITableView

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *) indexPath {} 

- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { 
return 1; 
} 

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger) section { 
return [self.mainController.dataForList count]; 
} 

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *) indexPath{ 
return 38.0f; 
} 

- (UITableViewCell *) tableView: (UITableView *) tableView 
     cellForRowAtIndexPath: (NSIndexPath *) indexPath { 
// call render method in view, it works fain 
return [self.signUpToTestView renderUnsignedCell:tableView cellForRowAtIndexPath:indexPath]; 
} 
+0

Это может быть полезно: http://stackoverflow.com/questions/1470898/using-insert-rows-in-a-uitableview – o15a3d4l11s2

+0

Ваш массив данныхForList, который, как я полагаю, является источником данных для вашего вида таблицы, отсутствует синхронизации с состоянием таблицы. – jmstone617

+0

Да, я тоже так думаю, но я не знаю, где я делаю загадку. – kraag22

ответ

3

Вы меняете numberOfSection и numberOfRowsInSection согласно вашему массиву после кликов?

return [arr count]; 

, а также попробуйте перезагрузить таблицу

[table reloadData]; 
+0

Я не меняю количество разделов. Я использую только один раздел – kraag22

+0

, нет перезагрузки метода в UITableView – kraag22

+1

@ kraag22. Метод перезагрузки должен быть перезагружен. – tangqiaoboy

3

При добавлении строк с insertRowsAtIndexPaths убедиться, ваши UITableViewDataSource методы также возвращают новое значение и новые объекты для добавленной ячейки.

Проверьте tableView:numberOfRowsInSection: и tableView:cellForRowAtIndexPath:.

Иначе вы получаете исключение NSInternalInconsistencyException.

И если вы попытаетесь добавить все свои ячейки с помощью insertRowsAtIndexPaths, остановите свое действие и прочитайте this.

+0

tableView: numberOfRowsInSection: даже не вызывается. Я попытался добавить точку останова. – kraag22

0

Вот мысль

по вызову событий (когда содержимое изменения массива) установить логическое значение для истинно [Tableview reloadData]; a в таблицеView: numberOfRowsInSection: сбросить номера.

Не забудьте также изменить Tableview: cellForRowAtIndexPath: соответственно

+0

My tableView: numberOfRowsInSection: только что возвращает: return [self.dataForList count]; – kraag22

0
if (indexpath) { 
     [self.tableView beginUpdates]; 
     [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexpath] withRowAnimation:UITableViewRowAnimationMiddle]; 
     [self.tableView endUpdates]; 
} 
1

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

[self.dataForList addObject:newRow]; 
    [self.unsignedTableView reloadData]; 

Затем делегат методы взять на себя, чтобы вернуть правильное количество строк:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
     // Return the number of rows in the section. 
     return [self.unsignedTableView count]; 
    } 
+0

Нет видимого @interface для 'UITableView' объявляет селектор 'count' –

7

Убедитесь, что созданный табличный вид имеет набор делегатов и набор данных.

Для например:

[self.unsignedTableView setDelegate:self]; 
[self.unsignedTableView setDatasource:self]; 

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

+0

, что вы имеете в виду 'они не получают вызов' - не должен' UITableView' называть их? – Mobigital

0

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

myArrayName = [[[NSMutableArray alloc] init]]; 

ваш случай может отличаться, и я хотел бы предложить сделать шаг назад и глядя на свой код, прежде чем пытаться модифицировать код. Месяцы спустя, но надеюсь, что это поможет!

0

Ответ на старый вопрос ..

NSArray *insertIndexPaths = [NSArray arrayWithObject: 
          [NSIndexPath indexPathForRow: 
           [self.dataForList count] // is zero now 
           inSection:0]]; 

[self.dataForList addObject:newRow]; 
// [self.dataForList count] is 1 now 

своп тех, и она должна работать:

[self.dataForList addObject:newRow]; 
// [self.dataForList count] is 1 now 

NSArray *insertIndexPaths = [NSArray arrayWithObject: 
          [NSIndexPath indexPathForRow: 
           [self.dataForList count] // is also 1 now, hooray 
           inSection:0]]; 
0

Причина вашей проблемы в том, что вы меняете источник данных и пользовательский интерфейс в двух разных точках. Как ваше обновление источника данных, так и ваш вставной вызов должны быть в одном и том же начальном/конечном блоке.

Таким образом, ваша проблема может быть устранена простым перемещением вызова beginUpdates перед вызовом addObject.

0

То, что меня достало, когда я столкнулся с этой проблемой, было то, что мои ReuseIdentifiers были не такими. Для меня единственной разницей была большая буква. Не думайте, что ваша проблема сначала является чем-то смехотворным. Пройдите и проверьте все простые вещи.

Если вы используете раскадровку, вы должны буквально скопировать и вставить строку из атрибутов ячейки в построителе интерфейса в ReuseIdentifier в свой код таблицы.

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