在1个非表视图控制器中显示多个核心数据实体对象

时间:2014-10-16 06:19:56

标签: ios objective-c iphone core-data

我不确定如何说出标题,如果之前被问过,我会提前道歉。我还没有找到答案。

是否可以在单个视图中显示两个(或更多)Core Data内容?例如,如果您有一个名为Parents的实体和一个名为Children的实体,Parent与Children有一个很多的关系,我可以在详细的View Controller中显示以下内容:

父母姓名:妈妈爸爸

儿童:儿童1儿童2儿童3

目前我只能在一个视图中显示一个或另一个,除非我添加一个表视图嵌入VC,但这个解决方案在每个场景中都不可行。

事件的流程很简单:

Table View Controller显示Parents CD实体中父项的名称。点击一行,然后转到详细信息VC。从那里我想显示所选父母的姓名以及已保存给他们的所有孩子。

任何人都可以回答这个简单的问题吗?

3 个答案:

答案 0 :(得分:1)

您的获取结果控制器已配置(可能)以获取父对象。如您所见,您不能要求它提供Child对象的详细信息。但是Parent对象应该有一个引用它们的属性。如果该属性被命名为" children",那么您可以按如下方式访问任何给定父级的子级:

NSSet *currentChildren = parent.children;

NSSet *currentChildren = [parent valueForKey:@"children"];

因此,在您的prepareForSegue方法中,如果您在detailsVC中设置detailsVC.selectedParent = selectedParent;,则可以self.selectedParent.children访问子项。这将是一组无序的Child对象,但您可以使用for ( in )枚举它们。例如:

for (Child *child in self.selectedParent.children) {
    NSLog(@"Child name is %@", child.childFirstName);
}

应记录所选父项的所有子项的名字。

答案 1 :(得分:0)

您可以创建一个连接父项和子项的获取请求,并将结果设置为内容数组到数组控制器。然后,这将作为表视图的数据源。

答案 2 :(得分:0)

我已经搜索了很多这个问题的答案,并通过这样做了zilch。

尝试连接主VC中的Parent和Children实体,并通过prepareForSegue将详细信息传递给详细信息VC无法正常工作:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    if ([[segue identifier] isEqualToString:@"showDetails"]){

        NSIndexPath * indexPath = [self.tableView indexPathForSelectedRow];

        DetailViewController * detailsVC = segue.destinationViewController;

        Parent * selectParent= (Parent *) [[self fetchedResultsController] objectAtIndexPath:indexPath];
        Children * children = (Children *) [[self fetchedResultsController] objectAtIndexPath:indexPath];

        detailsVC.selectedParent = selectedParent;
        detailsVC.showChildren = children;

    }

}

在prepareForSegue和DetailVC的其他几个变体中,由于fetchedResults中的引用直接指向Parents,因此它无法正常工作并抛出错误,尽管对Children集合有任何子引用。

阅读NSFetchedResultsController文档,我发现了这个:

  

使用获取的结果控制器有效地管理从Core Data获取请求返回的结果,以便为UITableView对象提供数据。

     

虽然可以通过多种方式使用表视图,但获取的结果控制器主要用于帮助您获取主列表视图。

这有效地表明fetchedResults用于在表格视图中显示数据,其具有假定的前景,即任何其他视图将无法正确使用fetchedResults

为了解决这个问题,我在Detail VC的未使用空间中使用了一个非常小的表格视图控制器,并将其设置为0.0。

显示子类详细信息的方法在以下方法中执行:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath:indexPath];

    Children * childDetails = [self.fetchedResultsController objectAtIndexPath:indexPath];

    self.childNameLabel.text = childDetails.childFirstName;

    return cell;
}

这克服了我的问题。我知道它的作弊但它有效。我希望我的发现可以帮助处于相同情况的人。

如果有更好的方法,请回答,我很乐意给它打勾。