从 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的主要内容,如果未能解决你的问题,请参考以下文章
在 UITableView 中删除 CABasicAnimation
将 UITable 行号从大到小反转(...5,4,3,2,1)