在 iOS7 中使用核心数据删除表格视图中的行的奇怪行为
Posted
技术标签:
【中文标题】在 iOS7 中使用核心数据删除表格视图中的行的奇怪行为【英文标题】:Weird behaviour of deleting row in table view using core data in iOS7 【发布时间】:2013-12-19 16:31:49 【问题描述】:我正在我的 ios 应用程序中测试 UILongPressGestureRecognizer 的使用。这是场景: 1.- 一个 tableview 控制器显示来自核心数据实体的记录。 2.- 从核心数据实体中删除行的一种方法(通常使用commitEditingStyle),用于从核心数据实体中删除选定的行。 3.- 一种 UILongPressGestureRecognizer 方法,用于长按行、触发警报视图以及从核心数据实体中删除选定行。
这是相关的代码: 第2点。-
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
if (editingStyle == UITableViewCellEditingStyleDelete)
NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
[context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];
NSError *error = nil;
if (![context save:&error])
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
NSError *error1 = nil;
if (![[self fetchedResultsController] performFetch:&error1])
NSLog(@"Unresolved error %@, %@", error1, [error userInfo]);
abort();
UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"To-Do Deleted" message: @"You have marked To-Do as deleted...!" delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
[self.tableView reloadData];
此方法按预期工作。触摸红色的 DELETE 按钮后,会显示警报视图,执行 performfetch 并重新加载表,但不显示最后删除的对象。之后,再次执行应用程序,证明删除的行确实被删除了,不再显示。
执行点 3.-,显示与点 2.- 相同的行为,只是在第二次执行应用程序后,删除的行再次出现,这意味着它没有从核心数据中删除。这是第 3 点的代码。-
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:@"Cell"] autorelease];
//long press
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 1.00;
//seconds
[cell addGestureRecognizer:lpgr];
[self configureCell:cell atIndexPath:indexPath];
return cell;
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
CGPoint p = [gestureRecognizer locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
if (indexPath == nil)
NSLog(@"long press on table view but not on a row");
else
if (gestureRecognizer.state == UIGestureRecognizerStateEnded)
NSLog(@"UIGestureRecognizerStateEnded");
//Do Whatever You want on End of Gesture
else if (gestureRecognizer.state == UIGestureRecognizerStateBegan)
UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Announcement" message: @"You have long-pressed the row...!" delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
NSLog(@"UIGestureRecognizerStateBegan.");
NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
[context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];
NSLog(@"long press on table view at row %d", indexPath.row);
// Update ToDoStatus
NSError *error1 = nil;
if (![[self fetchedResultsController] performFetch:&error1])
NSLog(@"Unresolved error %@, %@", error1, [error1 userInfo]);
abort();
[self.tableView reloadData];
//Do Whatever You want on Began of Gesture
我无法找到意外行为的原因。欢迎任何帮助。谢谢
【问题讨论】:
【参考方案1】:您是否可能忽略了保存NSManagedObjectContext
?这可以解释为什么该项目会消失,但随后会在稍后发布时重新出现。
除此之外:您的第一个片段中的这一行
NSLog(@"Unresolved error %@, %@", error1, [error userInfo]);
指error1
和error
;一个错误,但不是问题的原因。
【讨论】:
也就是说,你是对的。非常感谢,我整天都在处理这个问题....以上是关于在 iOS7 中使用核心数据删除表格视图中的行的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章
用于在 Swift 中删除 UITableView 中的行的编辑按钮不起作用
如何在xamarin中删除集合视图中的一个单元格和sqlite中的行的删除按钮?