使用“编辑/删除”或“滑动删除”手势删除项目后,我的表格不会更新。如果我执行编辑/删除,则删除按钮不会消失。它处于压制/卡住状态。当我单击完成时,删除按钮消失。这个截图位于这篇文章的底部。
我的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
中的代码已执行。
答案 0 :(得分:2)
经过几个小时的搜索,我发现了问题。结果是故事板中tableview的引用插座到我的控制器类中的myTable不再存在。我一定是不小心把它取下来了。当我用myTable
替换self.tableView
时,我注意到代码开始工作时,我发现了它。
答案 1 :(得分:0)
您需要在beginUpdates
和endUpdates
之间添加删除动画。
[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];
}
}