我不确定如何说出标题,如果之前被问过,我会提前道歉。我还没有找到答案。
是否可以在单个视图中显示两个(或更多)Core Data内容?例如,如果您有一个名为Parents的实体和一个名为Children的实体,Parent与Children有一个很多的关系,我可以在详细的View Controller中显示以下内容:
父母姓名:妈妈爸爸
儿童:儿童1儿童2儿童3
目前我只能在一个视图中显示一个或另一个,除非我添加一个表视图嵌入VC,但这个解决方案在每个场景中都不可行。
事件的流程很简单:
Table View Controller显示Parents CD实体中父项的名称。点击一行,然后转到详细信息VC。从那里我想显示所选父母的姓名以及已保存给他们的所有孩子。
任何人都可以回答这个简单的问题吗?
答案 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;
}
这克服了我的问题。我知道它的作弊但它有效。我希望我的发现可以帮助处于相同情况的人。
如果有更好的方法,请回答,我很乐意给它打勾。