繁体   English   中英

从UITableView删除行时出现问题

[英]Problems deleting rows from UITableView

我有一个UITableView,它显示用户保存的pdf文件列表(来自Documents文件夹)。

当我尝试删除表中的唯一行时,它工作正常。

但是,当行多于一行时,例如,我尝试删除第三行,我得到了..

*** 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 (2) must be equal to the number of rows contained in that section before the update (2), 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).'

现在,我尝试检查我的数组计数是否大于0,在这种情况下,我删除了该行,否则删除了indexSet,但是没有任何运气。

这是我正在使用的代码

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [tableView beginUpdates];

        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

        NSError *error;
        NSFileManager *fileMgr = [NSFileManager defaultManager];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *filePath = [documentsDirectory
                               stringByAppendingPathComponent:[NSString stringWithFormat:@"%@",[self.pdfArray objectAtIndex:indexPath.row]]];
        if ([fileMgr removeItemAtPath:filePath error:&error] != YES)
        {   UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:NSLocalizedString(@"UnableToDeleteFile", @"Unable to delete file: %@"),[error localizedDescription]] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] autorelease];
            [alert show];
        }
        [self.pdfArray removeObjectAtIndex:indexPath.row];

        [self refreshTable];

        [tableView endUpdates];

    }
    [self.tableView reloadData];
}

其中[self refreshTable]显示带有标签的视图,指出没有保存PDF:

- (void) refreshTable {
    [self fillArray];
    [self.tableView reloadData];

    if (self.pdfArray.count == 0)
    {
        [UIView animateWithDuration:1.0f animations:^{
            noPDF.view.alpha = 1;
        }];
        self.navigationItem.rightBarButtonItem = nil;
        self.tableView.userInteractionEnabled = NO;
    }
    else
    {
        noPDF.view.alpha = 0;
        self.navigationItem.rightBarButtonItem = self.editButtonItem;
        self.tableView.userInteractionEnabled = YES;
    }

}

现在,我实际上无法解决该问题,因此,非常感谢您的帮助!

这里的问题是,您应该在调用deleteRowsAtIndexPaths:之前从pdfArray中删除该对象。 所以添加这个::

[self.pdfArray removeObjectAtIndex:indexPath.row];

调用deleteRowsAtIndexPaths之前,因为deleteRowsAtIndexPaths会从tableView中删除一行,并且根本不会修改模型。 你必须自己做。 单元格将被删除,但是如果您在从模型中删除行之前调用reloadData。 该单元将重新出现。 因此,它期望您更新模型。

哇,完美的时机。 不久后,我写了这个答案,我做了一些调整方法[self refreshTable]移动[自fillArray]方法viewDidLoad和[自refreshTable]到viewDidAppear所以现在我有

-(void)viewDidLoad{
    [self fillArray];
}

-(void)viewDidAppear:(BOOL)animated{
   [self refreshTable];

}

行删除效果很好。

不过,感谢您的宝贵时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM