gpt4 book ai didi

ios - 添加项目(核心数据)时更新 UICollectionView,卡在 insertItemsAtIndexPaths 上

转载 作者:行者123 更新时间:2023-11-29 12:37:44 24 4
gpt4 key购买 nike

好吧,我真的被困在这里了:/在 Apple 的 Collection View Programming Guide 中插入一个项目,它说有两个步骤:

  1. 更新数据源对象中的数据。
  2. 调用 Collection View 的适当方法以插入或删除部分或项目。

我卡在第二个了。我希望新项目出现在 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 方法。对于您想要的功能,作为获取结果 Controller 的委托(delegate)是关键。

NSFetchedResultsController 的一个实例将通知它的代表对匹配它的获取请求的对象集合的更改。它通过在它的委托(delegate)上调用各种 NSFetchedResultsControllerDelegate 方法来做到这一点。例如,如果将一个新对象插入分配给匹配获取请求的获取结果 Controller 的 NSManagedObjectContext,将调用以下 NSFetchedResultsControllerDelegate 方法:

controllerWillChangeContent:

controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:

controllerDidChangeContent:

controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: 是您调用 Collection View 上的 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 方法。不需要使用批量更新来更改 Collection View ,并且可以轻松实现。

关于ios - 添加项目(核心数据)时更新 UICollectionView,卡在 insertItemsAtIndexPaths 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25815879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com