从 UITableView 中删除 UITableViewCell

Posted

技术标签:

【中文标题】从 UITableView 中删除 UITableViewCell【英文标题】:Deleting a UITableViewCell from UITableView 【发布时间】:2013-08-20 03:40:42 【问题描述】:

我正在使用 fmdb 来管理一些显示在常规 UITableView 上的数据。我正在尝试使用此代码删除一个单元格:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
        db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];


        [db open];

        [db beginTransaction];

        NSString * stringtoInsert = [NSString stringWithFormat: @"DELETE FROM TTLogObject WHERE id='%@'", [idArray objectAtIndex:indexPath.row]];

        BOOL success = [db executeUpdate:stringtoInsert];

        if (!success)
        
            NSLog(@"insert failed!!");
        

        NSLog(@"Error %d: %@", [db lastErrorCode], [db lastErrorMessage]);

        [db commit];

        [db close];

        [self getList];
    

这是我正在使用的 viewDidLoad 和 getList 函数的代码。

   - (void)viewDidLoad

    [super viewDidLoad];

     self.navigationController.navigationBar.tintColor = [UIColor blackColor];

    shipperCityArray = [[NSMutableArray alloc] init];
    pickupDateArray = [[NSMutableArray alloc] init];
    paidArray = [[NSMutableArray alloc] init];
    idArray = [[NSMutableArray alloc] init];

    //NSString *path  = [[NSBundle mainBundle] pathForResource:@"tt" ofType:@"db"];


    [self getList];



- (void)getList

    db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
    [shipperCityArray removeAllObjects];
    [pickupDateArray removeAllObjects];
    [paidArray removeAllObjects];
    [idArray removeAllObjects];

    [db open];

    FMResultSet *fResult= [db executeQuery:@"SELECT * FROM TTLogObject"];


    while([fResult next])
    
        [shipperCityArray addObject:[fResult stringForColumn:@"shipperCity"]];
        [pickupDateArray addObject:[fResult stringForColumn:@"pickupDate"]];
        [paidArray addObject:[NSNumber numberWithBool:[fResult boolForColumn:@"paid"]]];
        [idArray addObject:[NSNumber numberWithInteger:[fResult intForColumn:@"id"]]];
        NSLog(@"%@", [NSNumber numberWithInteger:[fResult intForColumn:@"id"]]);
    


    [db close];

    [self.tableView reloadData];

问题是数据从数据库中删除得很好。但是,按下删除后,表格视图不再显示任何单元格。当我重新启动应用程序时,正确的数据会再次加载,而被删除的单元格实际上已经消失了。我怀疑它与numberOfRowsInSection 有关。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    NSLog(@"%i", [shipperCityArray count]);
    return [shipperCityArray count];

当应用程序启动时,它会打印适当数量的单元格,但是当点击删除时,它不会打印任何内容,并且似乎没有被调用。

我曾尝试使用[self.tableView beginUpdates][self.tableView endUpdates],但它们似乎错误地说明了删除后导致的错误数量的项目。我不知道如何解决这个问题。如果我必须使用 beginUpdates 和 endUpdates,有人可以向我解释这应该如何正确完成,以及实际发生了什么?

【问题讨论】:

【参考方案1】:

您需要明确告诉您的 tableView 您正在删除一个单元格,而不是调用 reloadData。替换

[self.tableView reloadData];

[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];

你应该在你的 commitEditingStyle 方法中调用它。

【讨论】:

我正在尝试使用它,我应该将什么传递给 deleteRowsAtIndexPaths?现在,如果我按原样保留代码行,则会收到此错误:-[NSIndexPath count]: unrecognized selector sent to instance 0x7566e50 2013-08-19 22:57:28.808 Trucking Tracker[13861:c07] ***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSIndexPath 计数]:无法识别的选择器已发送到实例 0x7566e50” 它需要一个索引路径数组,而不是一个,所以你必须给它一个单元素数组。我刚刚更新了它,对此感到抱歉。 啊,我试过了。如果我按照所示进行操作,它会给我以下信息: *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效。之后现有节中包含的行数更新 (2) 必须等于更新 (2) 之前该节中包含的行数,加上或减去从该节插入或删除的行数(0 插入,1 删除)加上或减去数字移入或移出该部分的行数(0 移入,0 移出)。' 需要在调用getList方法后调用,这样count方法才能返回正确的元素个数。 嗯,我只是没有运气,现在它给了我这个: *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2380.17/UITableView.m :862 2013-08-19 23:06:22.926 Trucking Tracker[14743:c07] *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“尝试从第 0 节中删除第 3 行,该第 3 行在更新'

以上是关于从 UITableView 中删除 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

不要删除 UITable 的第一行

在 UITableView 中删除 CABasicAnimation

将 UITable 行号从大到小反转(...5,4,3,2,1)

不调用UITableView Delegate

在运行应用程序时将数据写入 plist 并将它们读取到 UITable

在 UITableView 中滚动时移除 UIView