删除某个部分中的所有表行
对于我的 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];
}
知道我做错了什么吗?
For my iPad project I need to be able to reload table rows.
This is how it should works, depend on some "id" selected from a popupview, i need to be able to reload table rows, table rows are dynamics and has a UITextField in it. I tried to use [self.tableView reload] but for some reason it does not update the rows correctly. Something like UITextField placeholder owned by previous "id" does not change. What I have in mind is to remove all cells in that specific section and reload the table with the new "id". When i do this i got this exception:
* Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (0 inserted, 3 deleted).'
The project code:
- (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];
}
Any idea what i did wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
看起来您忘记更改表视图数据源的数据。
您不能只更改表格视图布局。
如果要删除某个部分,则必须先从数据源中删除该部分。
您可以通过删除 NSMutableArray (这是您的数据源)中的部分来简单地完成此操作。
或者,您可以编写一个大的 if then else 怪物,计算出在
numberOfSectionsInTableView:
和tableView:numberOfRowsInSection:
中返回多少节(和行)。不管你怎么做,但你必须在更新表视图之前删除数据。
另一件事是,同时具有
[self.tableView beginUpdates]; /*...*/ [self.tableView endUpdates];
和[self.tableView reloadData];
在一种方法中通常是无用的。后者会破坏你从第一个中获得的动画效果。Looks like you forgot to change the data of the datasource of the tableview.
You can't just change the tableview layout.
If you want to remove a section, you have to remove this section from the datasource first.
You could do this the easy way, by removing the section in a NSMutableArray (which is your datasource).
Or you could write a big if then else monster that figures out how much sections (and rows) to return in
numberOfSectionsInTableView:
andtableView:numberOfRowsInSection:
.Doesn't matter how you do it, but you have to remove the data before you update the tableview.
One more thing, having both
[self.tableView beginUpdates]; /*...*/ [self.tableView endUpdates];
and[self.tableView reloadData];
in one method is usually useless. THe latter would kill the animation effect you get from the first one.