我有一个UITableView有2个部分。部分0包含文件名列表,用户可以点击它们来切换选中的附件。此部分也是可编辑的,因此用户可以轻扫以删除文件/行。第1部分不可编辑,并且包含1行,并用作启动文件传输的按钮。一次编辑UITableView的多个部分会导致崩溃
因此,该表的数据源看起来像这样:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case SECTION_FILES:
return [files count];
break;
case SECTION_ACTIONS:
if ([files count]) {
return 1; // ROW_ACTIONS_TRANSFER
return 0;
break;
}
return 0;
}
,我想是为第1只显示当部分0具有行中的行为。我发现的问题是,当部分0中的最后一行被删除时,部分1仍然包含1行。要从第一部分删除行,我想我应该调用deleteRowsAtIndexPath或reloadSections,同时提交第0部分最后一行的编辑,然后单元格将被动画化。但是,这样做会导致我的应用程序崩溃说:
终止应用程序由于未捕获的异常“NSInternalInconsistencyException”,理由是:“无效的更新:第1节包含在现有的部分中的行数行数无效在更新(1)之后,必须等于在更新(1)之前包含在该部分中的行数,加上或减去从该部分插入或删除的行数(0插入,1删除)。
我可以在tableview上调用reloadData,但更新是一个剧烈的重绘,我更愿意为单元格设置动画。有没有办法实现我想要的?我觉得这应该很容易,我错过了一些明显的东西。
我的commitEditingStyle代码如下。我首先从我的数据源(文件)中删除,这是推荐的方式,对吗?
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
switch ([indexPath section]) {
case SECTION_FILES:
[files removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
// Here is where I would call [tableView reloadData] or [tableView reloadSection...
break;
}
}}
在提交表视图动画之前或之后,您是否从“文件”NSArray中删除? (如果您提供了tableView:commitEditingStyle:forRowAtIndexPath:内容以便我们可以看到您是否有动画块以及您在做什么的顺序会很有帮助) – 2010-08-16 22:30:13
更新后回答布伦特。 – brianpartridge 2010-08-18 16:44:04