1

在我的应用程序中,我有一个视图控制器,它是 NSFetchedResultsController 的代表以及 UITableView 的代表和数据源。

当按下导航控制器中的添加按钮时,下一个视图被正确推送,我可以正确添加一个新的 Person 实体。

我的问题是,当按下添加按钮时,在新视图被推送时,tableView 中会添加一个空白行,并且在正确创建新实体记录后仍然存在

这是添加按钮的目标操作:

- (void)addPerson:(id)sender
{
    AddPersonViewController *addPersonController = [[AddPersonViewController alloc] initWithNibName:@"AddPersonViewController" bundle:nil];

    [addPersonController setPerson:[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext]];

    [self.navigationController pushViewController:addPersonController animated:YES];
}

创建空白行的代码(来自 NSFetchedResultsControllerDelegate 的苹果文档)在这里:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath {

    UITableView *tableView = self.tableView;

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath]
                    atIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

任何想法如何停止创建这个空白行?

4

1 回答 1

1

打电话

[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext]

inaddPerson创建一个新的Person对象并将其添加到托管对象上下文中。如果表视图的获取结果控制器配置为获取所有Person对象,这将导致该新对象的新(空白)表行。

我不知道你的AddPersonViewController工作情况如何。如果它修改了通过 给出的对象setPerson,那么应该更新表格行。如果它创建一个新的Person对象,那么第一个(空白)条目将保留。

您可能应该延迟创建新的Person对象,直到AddPersonViewController拥有所有数据来实际创建和填充该对象。您可以通过将insertNewObjectForEntityForName:调用移动到AddPersonViewController,或使用从AddPersonViewController.

于 2012-10-13T10:31:21.413 回答