Как добавить данные в таблицу с помощью делегата? - PullRequest
0 голосов
/ 08 декабря 2011

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

Прежде всего, вот проект, так что вы можете загрузить его и посмотреть. http://dawtano.com/xc-project.zip

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

Приложение построено на раскадровке и состоит из:

  • DataModel (содержит исходный NSMutableArray)
  • ViewController (основной вид)
  • EditGrade (добавление данных в представление таблицы)
  • Grade (определение используемых строк)
  • GradeDetail (показывает детали ячейки)

EditGrade также содержит делегата, который добавляет функцию к кнопке Отмена и Готово.

Все работает (кроме кнопки Редактировать на GradeDetail)как следует, за исключением случаев, когда я пытаюсь добавить новые данные в таблицу.Проект строится без проблем.Это сообщение об ошибке, которое я получаю, и я не смог выяснить, в чем проблема:

2011-12-08 12:56:54.643 ArrayTableView[30711:f803] *** Assertion failure in -    
[_UITableViewUpdateSupport _computeRowUpdates], /SourceCache/UIKit_Sim/UIKit-     
1912.3/UITableViewSupport.m:386
2011-12-08 12:56:54.645 ArrayTableView[30711:f803] *** 
Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Invalid table view update.  The application has requested an update to 
the table view that is inconsistent with the state provided by the data source.'

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

Обновление
Благодаря @TJ я обнаружил ошибку в проекте, теперь проблема заключается в ее корректной реализации, поэтому addGrade работает.

Я добавил этот код в поле, которое @TJ указал:

- (void)tableView:(UITableView *)tableView commitEditingStyle:
(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
[self.dataModel removeGradeAtIndex:indexPath.row]; 
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}   
else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, 
and add a new  row to the table view
[self.dataModel addGrade:(Grade*)grades];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}   
}

Использую ли я правильное кодирование?У меня ощущение, что

[self.dataModel addGrade:(Grade*)grades];

неверно.Поскольку DataModel использует:

- (void)addGrade:(Grade*)grade
{
[self.grades addObject:grade];
}

1 Ответ

1 голос
/ 08 декабря 2011

@ Matias Если вы собираетесь вставить строки в таблицу, вам нужен следующий фрагмент кода:

 else if (editingStyle == UITableViewCellEditingStyleInsert) {
 // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
[self.dataModel addGrade ...
[tableView insertRowAtIndexPaths ...

Код будет похож на код, который вы написали выше, чтобы удалить строку в таблице:

 if (editingStyle == UITableViewCellEditingStyleDelete) {
 // Delete the row from the data source
 [self.dataModel removeGradeAtIndex:indexPath.row];

 [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
 }   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...