【问题标题】:Display multiple core data entities objects in 1 Non-Table View Controller在 1 个非表视图控制器中显示多个核心数据实体对象
【发布时间】:2014-10-16 06:19:56
【问题描述】:

我不确定如何措辞标题,如果之前有人问过,我提前道歉。我还没有找到答案。

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

父母姓名:爸爸妈妈

孩子:孩子 1 孩子 2 孩子 3

目前我似乎只能在单个视图中显示一个或另一个,除非我在 VC 中添加嵌入表视图,但这种解决方案并非在每种情况下都真正可行。

事件的流程很简单:

表视图控制器在父母 CD 实体中显示父母的姓名。点击一行,然后转到详细信息 VC。从那里我想显示所选父母的姓名以及已保存给他们的任何孩子的姓名。

谁能回答这个可能很简单的问题?

【问题讨论】:

    标签: ios objective-c iphone core-data


    【解决方案1】:

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

    NSSet *currentChildren = parent.children;
    

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

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

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

    应该记录所选父母的所有孩子的名字。

    【讨论】:

    • 看起来很棒。我会试一试,然后回复你。谢谢。
    • 按您说的工作,默认情况下也会按字母顺序排列名称。谢谢,从我这里得到滴答声。
    【解决方案2】:

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

    【讨论】:

    • 你有我可以在方法或 viewDidLoad 中使用的代码示例吗?
    【解决方案3】:

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

    尝试连接主 VC 中的父实体和子实体并通过 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 中的引用直接指向父母,它无法正常工作并引发错误,尽管对子集有任何子引用。

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

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

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

    这实际上表明fetchedResults 用于在表格视图中显示数据,并假定任何其他视图都无法正确使用fetchedResults

    为了克服这个问题,我在 Detail VC 的未使用空间中使用了一个非常小的表视图控制器,并将其 alpha 设置为 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;
    }
    

    这很好地解决了我的问题。我知道这是作弊,但它奏效了。我希望我的发现对处于相同情况的人有所帮助。

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

    【讨论】:

      猜你喜欢
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多