删除节中的所有表行

时间:2011-02-23 07:46:10

标签: objective-c ipad ios uitableview nsindexpath

对于我的iPad项目,我需要能够重新加载表格行。 这是它应该如何工作,取决于从弹出视图中选择的一些“id”,我需要能够重新加载表行,表行是动态的并且在其中有一个UITextField。我尝试使用[self.tableView reload]但由于某种原因它没有正确更新行。像之前的“id”所拥有的UITextField占位符之类的东西不会改变。我想到的是删除该特定部分中的所有单元格并使用新的“id”重新加载表。当我这样做时,我得到了这个例外:

* 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0节中的行数无效。更新后现有部分中包含的行数(3)更新(3)之前必须等于该部分中包含的行数,加上或减去从该部分插入或删除的行数(插入0,删除3)。'

项目代码:

- (void)selectedArchiefID:(NSString *) value {
   [self.popOverController dismissPopoverAnimated:YES];

   // collects all available document indexfields
   int rowCount = [indexDefinities count];
   NSMutableArray *indexPaths = [[NSMutableArray alloc] init];

   for (int curIndex=0; curIndex < rowCount; curIndex++) {
       [indexPaths addObject:[NSIndexPath indexPathForRow:curIndex inSection:0]];
   }

   // deletes rows
   if ([indexPaths count] > 0) {
      [self.tableView beginUpdates];
      [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
      //[self.tableView deleteSections:0 withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates]; //crashes here
   }

   [self.tableView reloadData];
}

知道我做错了吗?

1 个答案:

答案 0 :(得分:0)

您似乎忘了更改tableview数据源的数据。

您不能只更改tableview布局。

如果要删除某个部分,则必须先从数据源中删除此部分。 您可以通过删除NSMutableArray中的部分(这是您的数据源)以简单的方式执行此操作。

或者你可以编写一个大的if if else怪物,它可以计算出numberOfSectionsInTableView:tableView:numberOfRowsInSection:中要返回多少部分(和行)。

无论您如何操作,都必须在更新tableview之前删除数据。


另外一件事,在一种方法中同时使用[self.tableView beginUpdates]; /*...*/ [self.tableView endUpdates];[self.tableView reloadData];通常是无用的。后者会杀死你从第一个获得的动画效果。