在 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]);

error1error;一个错误,但不是问题的原因。

【讨论】:

也就是说,你是对的。非常感谢,我整天都在处理这个问题....

以上是关于在 iOS7 中使用核心数据删除表格视图中的行的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

用于在 Swift 中删除 UITableView 中的行的编辑按钮不起作用

如何在xamarin中删除集合视图中的一个单元格和sqlite中的行的删除按钮?

如何删除表视图核心数据中的行。斯威夫特3

如何将第二个表格视图的值与第一个表格视图的单击行的关系分开?

删除表格视图中的一行而不删除核心数据实体

以编程方式删除数据网格视图中的行标题