在UITableView中获取Core Data对象的indexPath

时间:2014-03-10 04:26:33

标签: ios uitableview core-data nsfetchedresultscontroller nsindexpath

我有一个UITableView,我使用以下NSfetchedResultsController从Core Data填充:

- (NSFetchedResultsController *)fetchedResultsController {
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:_managedObjectContext];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
}

我有另一个方法附加到“添加”按钮,该按钮将新的核心数据项添加到数据库。添加对象后,我的表会正确更新,并且根据获取的结果控制器中的“日期”排序,新对象将显示在正确的位置。我的新对象使用今天的日期添加其“日期”属性。我添加这样的对象:

NSManagedObject *newEvent = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:context];
[newEvent setValue:@"New Client" forKey:@"name"];
[newEvent setValue:[NSDate date] forKey:@"date"];
NSError *error;
    if (![context save:&error]) {
        NSLog(@"Core Data error!  Could not save: %@", [error localizedDescription]);
    }

现在,作为“添加”方法的一部分,我需要选择添加新项目的行并转到编辑屏幕。显然,根据表中项目的其他日期,它可能在任何地方。

我想像这样选择它,但我没有indexPath:

[self.eventListTable selectRowAtIndexPath:indexPath animated:YES  scrollPosition:UITableViewScrollPositionBottom];

如何确定添加了新对象的哪一行(indexPath),以便我可以正确选择它?

谢谢!

2 个答案:

答案 0 :(得分:12)

NSFetchedResultsController有一个名为indexPathForObject:

的方法

如果在更改处理期间插入了项目(FRC委托方法),请选择最近插入的项目。您可以使用上述方法确定对象的索引路径。

或者,您可以保留最后一次插入的插入对象,并在didChangeContent委托方法中,选择插入的项目并使您保留的变量无效(因此更多的calles不会触发segue)。 br />

答案 1 :(得分:1)

您需要在NSFetchedResultsController中找到要解析其indexPath的实体。但是,要这样做,您需要等待NSFetchedResultsController识别对象。您可能需要等待NSFetchedResultsController中的委托回调方法触发,然后使用-indexPathForObject:将其解析回indexPath,然后选择该行。

视觉上应该完美无缺。该行将出现,然后被选中。