UITableViewCell与UICollectionView

时间:2015-01-22 06:57:31

标签: core-data nsfetchedresultscontroller uicollectionviewcell

我正在关注本教程Creating a Scrolling Filmstrip Within a UITableView

但不是使用静态数组我使用nsfetchresultscontroller核心数据我有委托问题

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 1;
}

我想每个单元格只返回一个项目,其中包含所有项目:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
ContainerCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ContainerCell"];
NSArray *items = [[[self.frc sections] objectAtIndex:indexPath.section] objects];
[cell setCollectionData:items];
return cell;
}

但是我收到了这个错误:

CoreData: error: Serious application error.  An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  attempt to delete row 1 from section 9 which only contains 1 rows before the update with userInfo (null)

如果我正在使用

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSInteger rows = [super tableView:tableView numberOfRowsInSection:section];
return rows;
}

应用程序没有崩溃但我每个单元格都有重复

任何想法如何解决这个问题

由于

1 个答案:

答案 0 :(得分:0)

您在部分中使用的是非标准行数,因此必须确保在基础数据更改时删除并添加适当的行数。在你的情况下,没有。

在控制器中查找错误删除或添加行的委托方法。它在您的错误消息中提到,应该是

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

如您所见,在删除案例中,它执行此操作:

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

indexPath未在表格视图中描述您的托管对象的位置,因为您在单行中显示某个部分的所有行 。因此,您只需删除此行,并将其替换为该部分中第一个行的相应重新加载函数。也许你有一个{X}样板代码中的configureCell方法:

NSIndexPath *row = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
[tableView configureCell:[tableView cellForRowAtIndexPath:row] atIndexPath:row];