NSFetchResultController委托错误

时间:2011-09-09 12:51:05

标签: iphone ios uitableview delegates nsfetchedresultscontroller

我有几个UIViewControllers显示我的'User'对象的表视图作为部分,'Site'对象作为每个部分下的行。网站与用户之间的关系是一对多的。

目前我正在使用以下代码显示此数据:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:0];
    return [sectionInfo numberOfObjects];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    User *sectionUser = (User*)[self.fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:section inSection:0]];

    return [[sectionUser.sitesToUser allObjects] count];
}

在我的NSFetchResultsController中,我只是拉动所有User对象,没什么特别的。

现在我的问题 - 每当我更新结果时,删除一个部分(即用户)或添加用户,同时此视图也是打开的,我得到一个NSFetchedResultsController委托错误:

Serious application error.  An exception was caught from the delegate of 
NSFetchedResultsController during a call to -controllerDidChangeContent:.  Invalid
update: invalid number of sections.  The number of sections contained in the table
view after the update (2) must be equal to the number of sections contained in the
table view before the update (1), plus or minus the number of sections inserted or
deleted (0 inserted, 0 deleted). with userInfo (null)

我只在我以这种方式显示数据的视图中得到它,User is section,Site / s是每个部分下的行。

我做的事真的很蠢吗?我认为当我删除它时会删除该部分等...如果每个用户都是UITableView中的ROW,似乎工作正常 - 我相信这是我的问题的关键...

2 个答案:

答案 0 :(得分:0)

我正在使用核心数据,但我的numberOfSectionsInTableView:tableView:numberOfRowsInSection:方法的代码不同......我不知道这是否可以解决您的问题但是,请尝试使用此代码:< / p>

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [[self.fetchedResultsController sections] count];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSInteger rowsNumber = 0;
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    rowsNumber = [sectionInfo numberOfObjects];
    return rowsNumber;
}

对于这些部分,我从未使用它,但在初始化控制器时尝试处理sectionNameKeyPath的{​​{1}}参数。

答案 1 :(得分:0)

您尚未显示fetchedResultsController委托调用:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
- (void)controller:didChangeObject:atIndexPath:forChangeType:newIndexPath
- (void)controller:didChangeSection:sectionInfoAtIndex:forChangeType:

这些调用负责在表中添加和删除行/部分,因此就tableview而言,所有内容都“加起来”。

在你的情况下,你有点“滥用”一个部分是什么,所以这段代码可能会变得棘手。

如果你准备不做动画,你可以实现:

-(void)controllerDidChangeContent:(NSFetchedResultsController*) controller {
    [self.tableView reloadData];
}

丹尼尔。