[英]Updating a UICollectionView when an item is added (Core Data), stuck on insertItemsAtIndexPaths
好的,我真的很困在这里:/在Apple的Collection View编程指南中,要插入一个项目,它说有两个步骤:
我被困在第二个。 我希望新项目出现在集合视图的开始处。 我不知道要为insertItemsAtIndexPaths:参数添加什么。 我知道它想要一个索引对象数组,但是我不知道如何告诉它选择集合的开始,因为它是索引值,并且也对如何告诉其他内容感到困惑。 您可以在我的早期代码(cellForItemAtIndexPath)中看到,我在填充集合时正在修改单元格内按钮元素的属性。 如果我想在创建时修改新项目,该怎么做? 我真的很感谢任何帮助,我觉得我在这里很想念,而且真的碰壁了。
@implementation RepsCollectionViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Error : %@", error);
abort();
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - Collection view data source
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> secInfo = [self.fetchedResultsController.sections objectAtIndex:section];
return [secInfo numberOfObjects];
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
RepCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
Rep *rep = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.repButton.pressed = [rep.completed boolValue];
cell.repButton.indexPath = indexPath;
return cell;
}
#pragma mark - Fetched Results Controller
-(NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Rep" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"dateTimeCreated" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];
_fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
#pragma mark - IBActions
- (IBAction)addRep:(id)sender {
[NSEntityDescription insertNewObjectForEntityForName:@"Rep" inManagedObjectContext:self.managedObjectContext];
[self.collectionView performBatchUpdates:^{
[self.collectionView insertItemsAtIndexPaths:WHAT TO PUT HERE?];
} completion:nil];
}
您似乎尚未实现任何NSFetchedResultsControllerDelegate
方法。 对于所需的功能,关键是要获取结果控制器的委托。
NSFetchedResultsController
的实例将通知其委托,以匹配与其提取请求匹配的对象集合。 通过在其委托上调用各种NSFetchedResultsControllerDelegate
方法来实现。 例如,如果将新对象插入分配NSManagedObjectContext
获取请求匹配的获取结果控制器的NSManagedObjectContext
,则会调用以下NSFetchedResultsControllerDelegate
方法:
• controllerWillChangeContent:
• controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
• controllerDidChangeContent:
controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
是您在集合视图上调用insertItemsAtIndexPaths:
方法的地方,以告诉它数据源中有新项目可用。 看起来像:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UICollectionView *collection = self.collectionView;
switch(type) {
case NSFetchedResultsChangeInsert:
[collection insertItemsAtIndexPaths:@[newIndexPath] ];
break;
}
}
显然,一个真实的示例应该正确处理其他更改类型,这只是一个说明性示例。 您还应该实现其他NSFetchedResultsControllerDelegate
方法。 不需要将批处理更新用于集合视图更改,并且可以轻松实现。
我也无法正确理解您的问题。 但这对你有帮助
从核心数据中提取所有数据后,
[self.collectionView reloadData];
在此之前,将所有数据self.fetchedResultsController
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.