Ios 从核心数据添加新实体后重新加载UITableView

Ios 从核心数据添加新实体后重新加载UITableView,ios,uitableview,core-data,Ios,Uitableview,Core Data,当前在通过UINavigation add按钮添加实体时,在我的应用程序中重新加载UITableView时遇到问题,该按钮会触发view Controller实现文件中的addHero方法。从核心数据的角度来看,添加和删除实体工作得非常好,因为当退出并重新启动应用程序时,所有实体都会正确地显示在tableview中。在进行选项卡栏选择后重新加载视图时,它也可以正常工作。我已尝试重新加载表视图,但不确定需要在序列中的何处进行此方法调用 #pragma mark- NSFetchedResultsC

当前在通过UINavigation add按钮添加实体时,在我的应用程序中重新加载UITableView时遇到问题,该按钮会触发view Controller实现文件中的addHero方法。从核心数据的角度来看,添加和删除实体工作得非常好,因为当退出并重新启动应用程序时,所有实体都会正确地显示在tableview中。在进行选项卡栏选择后重新加载视图时,它也可以正常工作。我已尝试重新加载表视图,但不确定需要在序列中的何处进行此方法调用

#pragma mark- NSFetchedResultsControllerDelegate Methods

-(void)controllerWillChangeContent:(NSFetchedResultsController   *)controller
{
[self.heroTableView beginUpdates];
}


-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[_heroTableView reloadData];
[self.heroTableView endUpdates];

}

-(void)controller:(NSFetchedResultsController *)controller  didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
switch (type) {
    case NSFetchedResultsChangeInsert:
        [self.heroTableView insertSections:[NSIndexSet  indexSetWithIndex:sectionIndex]  withRowAnimation:UITableViewRowAnimationFade];

        break;
        case NSFetchedResultsChangeDelete:
        [self.heroTableView deleteSections:[NSIndexSet  indexSetWithIndex:sectionIndex]  withRowAnimation:UITableViewRowAnimationFade];
        break;
}
}

-(void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
switch (type) {
    case NSFetchedResultsChangeInsert:
        [self.heroTableView insertRowsAtIndexPaths:@[newIndexPath]  withRowAnimation:UITableViewRowAnimationFade];

        break;
        case NSFetchedResultsChangeDelete:
        [self.heroTableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

        break;
        case NSFetchedResultsChangeMove:
        case NSFetchedResultsChangeUpdate:
        break;
}

}

#pragma mark- UIAlertViewDelegateMethods

-(void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
{
exit(-1);
}


- (IBAction)addHero:(id)sender {

NSManagedObjectContext *managedObjectContext =    [self.fetchedResultsController managedObjectContext];

NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest]entity];
[NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:managedObjectContext];
NSError *error =nil;
BOOL sucess =[managedObjectContext save:&error];

if (!sucess) {
    UIAlertView *alert = [[UIAlertView  alloc]initWithTitle:NSLocalizedString(@"Error saving entity", @"Error Saving entity") message:[NSString stringWithFormat:NSLocalizedString(@"Error was: %@, quitting.", @"Error was: %@,quitting." )] delegate:self cancelButtonTitle:NSLocalizedString(@"Aw Nuts", @"Aw Nuts") otherButtonTitles: nil];
    [alert show]
  }


}
#pragma标记-NSFetchedResultsControllerDelegate方法
-(void)controllerWillChangeContent:(NSFetchedResultsController*)控制器
{
[self.heroTableView开始更新];
}
-(void)controllerDidChangeContent:(NSFetchedResultsController*)控制器
{
[\u heroTableView重新加载数据];
[self.heroTableView endUpdates];
}
-(void)控制器:(NSFetchedResultsController*)控制器didChangeSection:(id)sectionInfo atIndex:(nsInteger)ChangeType的sectionIndex:(NSFetchedResultsChangeType)类型
{
开关(类型){
案例NSFetchedResultsChangesInsert:
[self.heroTableView insertSections:[NSIndexSet IndexSetWithiIndex:sectionIndex]带RowAnimation:UITableViewRowAnimationFade];
打破
案例NSFetchedResultsChangeDelete:
[self.heroTableView deleteSections:[NSIndexSet IndexSetWithiIndex:sectionIndex]带RowAnimation:UITableViewRowAnimationFade];
打破
}
}
-(void)控制器:(NSFetchedResultsController*)控制器didChangeObject:(id)索引路径中的一个对象:(NSIndexPath*)变更类型的indexPath:(NSFetchedResultsChangeType)类型newIndexPath:(NSIndexPath*)newIndexPath
{
开关(类型){
案例NSFetchedResultsChangesInsert:
[self.heroTableView insertRowsAtIndexPaths:@[newindexath]带rowanimation:UITableViewRowAnimationFade];
打破
案例NSFetchedResultsChangeDelete:
[self.heroTableView deleteRowsAtIndexPaths:@[indexPath]带RowAnimation:UITableViewRowAnimationFade];
打破
案例NSFetchedResultsChangeMove:
案例NSFetchedResultsChangeUpdate:
打破
}
}
#pragma标记-UIAlertViewDelegateMethods
-(void)alertView:(UIAlertView*)alertView将使用buttonIndex:(NSInteger)buttonIndex解除警报
{
出口(-1);
}
-(iAction)addHero:(id)发件人{
NSManagedObjectContext*managedObjectContext=[self.fetchedResultsController managedObjectContext];
NSEntityDescription*实体=[[self.fetchedResultsController fetchRequest]实体];
[NSEntityDescription insertNewObjectForEntityForName:[实体名称]在managedObjectContext:managedObjectContext]中;
n错误*错误=nil;
BOOL suces=[managedObjectContext保存:&错误];
如果(!成功){
UIAlertView*alert=[[UIAlertView alloc]initWithTitle:NSLocalizedString(@“错误保存实体”,“错误保存实体”)消息:[NSString stringWithFormat:NSLocalizedString(@“错误为:%@,退出”。,@“错误为:%@,退出”)]委托:自取消按钮提示:NSLocalizedString(@“Aw螺母”,“Aw螺母”)其他按钮:无];
[警报显示]
}
}

这些行有冲突:

[_heroTableView reloadData];
[self.heroTableView endUpdates];
要么在
beginUpdates
endUpdates
之间更新表格,要么放弃动画,只需调用
reloadData
。上述情况产生了不可预测的结果


如果您的代理工作正常,它应该在必要时插入行,您应该调用
重新加载数据
。从外观上看,您使用的是样板文件
NSFetchedResultsControllerDelegate
,因此它应该可以按预期工作。

最终解决了这个问题。我忘记将“获取结果”控制器的委托设置为tableviewcontroller。然而,我最初是在viewDidLoad方法中这样做的,这导致了问题。最好的解决方案是在getter方法的实例化点设置fetchedResultscontoller的委托

_fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:sectionKey cacheName:@"Hero"];
_fetchedResultsController.delegate=self;
return _fetchedResultsController;