如何使用委托将数据添加到tableview?

时间:2011-12-08 12:18:24

标签: uitableview delegates ios5 storyboard

我正在使用tableview的初始视图控制器构建一个有趣的应用程序,您可以在其中查看单元格的详细信息,并将新数据添加到tableview。

首先,这是项目,因此您可以加载它并查看。 http://dawtano.com/xc-project.zip

这是一个复杂的项目,我认为很多代码已经过时,但最初的应用程序正在运行,所以我还不想清理它。

该应用程序围绕故事板构建,包括:

  • DataModel(包含初始NSMutableArray)
  • ViewController(主视图)
  • EditGrade(将数据添加到tableview)
  • 成绩(定义使用的字符串)
  • GradeDetail(显示单元格的详细信息)

EditGrade还包含一个委托,它为“取消”和“完成”按钮添加功能。

一切正常(除了GradeDetail上的“编辑”按钮),除非我尝试将新数据添加到tableview时。该项目没有任何问题。 这是我得到的错误消息,我无法弄清楚问题是什么:

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.'

我希望你们中的一些人能够确定问题是什么,我现在正盯着它看。

更新
感谢@ T.J。我在项目中发现了错误,现在的问题是实现它是正确的,所以addGrade可以工作。

我在@ T.J字段中添加了此代码。指出:

- (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 个答案:

答案 0 :(得分:1)

@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];
 }