【问题标题】:Get indexPath of Core Data object in UITableView在 UITableView 中获取 Core Data 对象的 indexPath
【发布时间】:2014-03-10 04:26:32
【问题描述】:

我有一个 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) 以便我可以正确选择它?

谢谢!

【问题讨论】:

    标签: ios uitableview core-data nsfetchedresultscontroller nsindexpath


    【解决方案1】:

    NSFetchedResultsController 有一个方法叫:indexPathForObject:

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

    或者,您可以保留上次插入时插入的对象,并在 didChangeContent 委托方法中,选择插入的项目并取消您保留的变量(因此进一步的调用不会触发 segue)。

    【讨论】:

    • 那么,这样呢?在我的 AddItem 方法中添加该方法并为其分配一个 ivar,然后在 didChangeContent 委托方法中,如果 ivar 存在,则使用 indexPathForObject 来选择和处理该行并将 ivar 设为 nil。如果 ivar 已经为零(因为更改来自编辑或删除),则什么也不做。这是你的意思吗?
    • 没错! (注意来自其他来源的插入,如网络同步等)
    • 谢谢!我会试试这个!
    【解决方案2】:

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

    从视觉上看,它应该可以完美运行。该行将出现,然后被选中。

    【讨论】:

    • 哪个回调方法? didChangeContent?
    • 发布UITableVIew 进行更新后,您绝对可以在那里进行。
    • 如果没有 didChangeContent,那么还有哪些其他选项?
    • 还有-controller: didChangeObject: atIndexPath: forChangeType: newIndexPath: 会为每个添加的新行触发,并且已经有indexPath。你也可以探索把它放在那里。
    • 我刚刚注意到-controller: didChangeObject: atIndexPath: forChangeType: newIndexPath: 我已经在观察“NSFetchedResultsChangeInsert”并将行插入到带有insertRowsAtIndexPath 的表中。那时,我已经有了对象的 indexPath。我可以这样做吗:[self.eventListTable selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom]; 那里? (我现在无法测试。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多