使用commitEditingStyle删除后没有更新或numberOfRowsInSection

时间:2012-11-26 12:30:46

标签: iphone xcode uitableview

使用“编辑/删除”或“滑动删除”手势删除项目后,我的表格不会更新。如果我执行编辑/删除,则删除按钮不会消失。它处于压制/卡住状态。当我单击完成时,删除按钮消失。这个截图位于这篇文章的底部。

我的numberOfRowsInSection代码在应用程序启动时执行,但在删除项目后不执行。

我正在使用UITableViewController。我的.h文件中的定义:

@interface BNVFavoritesTableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>{    
  BNVAppDelegate *appDelegate;    
  IBOutlet UITableView *myTable;
}

@property (retain, nonatomic) IBOutlet UITableView *myTable;
@end

以下是我的.m文件中的相关代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"number of rows:\t%d", [appDelegate.favoritesArray count]);
    return [appDelegate.favoritesArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    //Get the object from the array.
    BNVFavorite *favoriteObj = [appDelegate.favoritesArray objectAtIndex:indexPath.row];

    //Set the name.
    cell.textLabel.text = favoriteObj.name;

    // Set up the cell
    return cell;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    // If row is deleted, remove it from the list.
    if (editingStyle == UITableViewCellEditingStyleDelete){
        NSLog(@"before delete\t%d", [appDelegate.favoritesArray count]);        
        BNVFavorite *selectedObject = [appDelegate.favoritesArray objectAtIndex:indexPath.row];
        NSString *selectedName =  selectedObject.name;
        // delete from sqlite database
        [appDelegate removeFavoriteFromDB:selectedName];
        // delete from memory array
        [appDelegate.favoritesArray removeObjectAtIndex:indexPath.row];
        // delete in user interface
        [myTable deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        NSLog(@"after delete\t%d", [appDelegate.favoritesArray count]);

    }

}

删除时,我会在日志中看到“删除前”和“删除后”消息(按预期方式),但没有“行数”消息。

Table View中的我的数据源和委托出口连接到TableViewController类。我也尝试在ViewDidLoad方法中执行此操作,但这并没有产生不同。在[myTable reloadData];结束时强制commitEditingStyle也无济于事。

最后,这是“卡住”删除按钮的屏幕截图。 http://i.stack.imgur.com/ukUu0.png

单击几次会导致NSRangeException / out of bounds错误,表明commitEditingStyle中的代码已执行。

3 个答案:

答案 0 :(得分:2)

经过几个小时的搜索,我发现了问题。结果是故事板中tableview的引用插座到我的控制器类中的myTable不再存在。我一定是不小心把它取下来了。当我用myTable替换self.tableView时,我注意到代码开始工作时,我发现了它。

答案 1 :(得分:0)

您需要在beginUpdatesendUpdates之间添加删除动画。

[myTable beginUpdates];
[myTable deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[myTable endUpdates];

答案 2 :(得分:0)

只需在连接检查器中检查您的表的连接。

或者是否正确连接 删除记录后重新加载表

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    // If row is deleted, remove it from the list.
    if (editingStyle == UITableViewCellEditingStyleDelete){
        NSLog(@"before delete\t%d", [appDelegate.favoritesArray count]);        
        BNVFavorite *selectedObject = [appDelegate.favoritesArray objectAtIndex:indexPath.row];
        NSString *selectedName =  selectedObject.name;
        // delete from sqlite database
        [appDelegate removeFavoriteFromDB:selectedName];
        // delete from memory array
        [appDelegate.favoritesArray removeObjectAtIndex:indexPath.row];
        // delete in user interface
        [myTable deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        NSLog(@"after delete\t%d", [appDelegate.favoritesArray count]);
        [myTable reloadData];
    }

}