为啥删除 UITableView 行时会出现错误?
Posted
技术标签:
【中文标题】为啥删除 UITableView 行时会出现错误?【英文标题】:Why is an error occurring when a UITableView row is deleted?为什么删除 UITableView 行时会出现错误? 【发布时间】:2011-12-05 20:35:11 【问题描述】:我正在尝试使用 Apple Table View Programming Guide 中描述的标准编辑控件样式来实现 UITableViewCell 的标准删除。当commitEditingStyle方法中执行以下代码时
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
我收到以下错误消息
由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 2 节中的行数无效。更新后现有节中包含的行数 (1) 必须等于更新前该节中包含的行数 (1),加上或减去从该节插入或删除的行数(0 插入,1 删除)。
【问题讨论】:
【参考方案1】:您必须从数据源中删除单元格所代表的对象以及删除单元格:
[myObjectsArray removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
【讨论】:
【参考方案2】:如果它是唯一的行,我建议您也删除该部分。您还需要将数据源与表同步,即同时删除数据源中的行。
当文件系统是您在 ios 中的数据源时,这是一个正确的示例:
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
if (editingStyle == UITableViewCellEditingStyleDelete)
// Delete the row from the data source.
File *file = (File *)[self.files objectAtIndex:indexPath.row];
[[NSFileManager defaultManager] removeItemAtPath:file.path error:nil];
[self.files removeObject:file];
if (indexPath.row == 0 && [self.files count] == 0)
NSInteger sectionIndex = [indexPath indexAtPosition:0];
[tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
else
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self setupData];
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.
【讨论】:
空白部分没有问题。正如 Tom Irving 所指出的,这里的问题只是更新数据模型以适应删除的项目。 删除最后一行的干净且正确的方法是删除该部分。我的回答对 OP 来说是最完整和最有帮助的。有很多很好的例子,包括我自己的开发经验。这是一个 *** 演示一个案例(18 个赞成票):***.com/a/1265050/230571 您是要保留空白部分还是完全删除这些部分是一个偏好问题。如果这是需要的(开发人员或客户),那么您就是这样做的,我不在乎有多少赞成票。 我演示的方法涵盖了大多数情况——这是因为 OP 还不了解这部分 SDK 的工作原理。当然,这不是关于赞成票,而是关于他们所代表的内容——它适用于许多事先不知道如何处理这种情况的开发人员。 “如果它是唯一的行,您还需要删除该部分”,我的意思是您不需要需要,但通常会这样做。跨度>以上是关于为啥删除 UITableView 行时会出现错误?的主要内容,如果未能解决你的问题,请参考以下文章