删除并添加UITableView行

时间:2014-08-16 06:24:31

标签: objective-c uitableview ios7

在我的应用程序中,我有一个我在- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section中指定的UITableView有150行。现在,我的数据源NSArray有超过150个元素,因此,正如预期的那样,我的表显示了前150个。我还实现了- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath,以便用户可以从UITableView中删除元素。当用户删除一行时,我想要发生的事情是删除的行消失(带动画),然后将其余的行向上滑动,以及数据源数组的第151个元素,这在以前不是显示,显示为表格的最后一个元素。但是,到目前为止我所尝试的一切都给了我以下错误:

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 (150) must be equal to the number of rows contained in that section before the update (150), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'
First throw call stack:
(0x2e58fecb 0x38d2ace7 0x2e58fd9d 0x2ef3de2f 0x30f94761 0x30ff0f7f 0x2af0f49 0xdf763 0x30fba567 0x30fba4f9 0x30df66a7 0x30df6643 0x30df6613 0x30de1d5b 0x30df605b 0x30db9521 0x30df1305 0x30df0c2b 0x30dc5e55 0x30dc4521 0x2e55afaf 0x2e55a477 0x2e558c67 0x2e4c3729 0x2e4c350b 0x334326d3 0x30e24871 0x106b59 0x39228ab7)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

以下代码解释了我试图实现此目的的要点:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        PNObject *objectToDelete = contentArray[indexPath.row];
        NSMutableArray *mutableCopy = [contentArray mutableCopy];
        [mutableCopy removeObject:objectToDelete];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}

1 个答案:

答案 0 :(得分:1)

不知道是否还有相关配偶,
但我认为发生的事情是您实际上并未更新数据源。

您正在创建数据源的“本地”可变副本,并删除该副本中的对象,但您的实际数据源保持不变,并且仍包含要删除的项目。

我猜你的numberOfRows:inSection:包含[contentArray count]

的某些变体

所以发生的事情就是你从表格视图中“删除”了一个项目,因此你的应用程序除了该表格视图外还有一个项目, 但是在重新加载表视图的内容时,由于项目未从数据源中删除,因此表视图还有一个项目超出预期。

要解决此问题,请将contentArray更改为NSMutableArray,
在上面的代码中,直接从那里删除objectToDelete 然后,您也可以直接从数组中删除对象,而不创建对它的本地引用。 所以你的上面的代码应该是这样的:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {  

        [contentArray removeObjectAtIndex:indexPath.row];  
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];  
    }  
}