Ios NSFetchedResultsController-家长和祖父母作为章节标题

Ios NSFetchedResultsController-家长和祖父母作为章节标题,ios,uitableview,core-data,one-to-many,nsfetchedresultscontroller,Ios,Uitableview,Core Data,One To Many,Nsfetchedresultscontroller,我正在尝试使用NSFetchedResultsController创建一个分区表视图。我的数据模型如下所示: 城市>地区>街道 我的TableView应该如下所示: ,------------, | City 1 | --- Section 0 `------------´ ,------------, | District 1 | --- Section 1 `------------´ | Street 1 | --- Row 0 `------------´

我正在尝试使用NSFetchedResultsController创建一个分区表视图。我的数据模型如下所示:

城市>地区>街道

我的TableView应该如下所示:

,------------,
| City 1     |    --- Section 0
`------------´

,------------,
| District 1 |    --- Section 1
`------------´
| Street 1   |    --- Row 0
`------------´
| Street 2   |    --- Row 1
`------------´

,------------,
| District 2 |    --- Section 2
`------------´
| Street A   |    --- Row 0
`------------´
| Street B   |    --- Row 1
`------------´

,------------,
| City 2     |   --- Section 3
`------------´
问题是,如果我在FetchedResultsController上定义sectionNameKeyPath,我只会获得地区名称或城市名称,但不能同时获得两者。 这可能吗

到目前为止,这是我的FetchedResultsController:

- (NSFetchedResultsController *)fetchedResultsController {

    if (_fetchedResults != nil) {
        return _fetchedResults;
    }

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

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"toDistrict.toCity.toUser.userId = %@",currentUser.userId];

    NSSortDescriptor *sortCities = [[NSSortDescriptor alloc] initWithKey:@"toDistrict.toCity.name" ascending:YES];
    NSSortDescriptor *sortDistricts = [[NSSortDescriptor alloc] initWithKey:@"toDistrict.name" ascending:YES];
    NSSortDescriptor *sortStreets = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortCities, sortDistricts, sortStreets, nil]];

    [fetchRequest setFetchBatchSize:20];
    [fetchRequest setPredicate:predicate];
    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"toDistrict.toCity.name" cacheName:@"Root"];
    self.fetchedResults = theFetchedResultsController;
    fetchedResults.delegate = self;

    return _fetchedResults;

}
为了实现上述TableView的外观,我需要更改什么?还是我完全错了,需要一个不同的结构


任何提示和帮助都将不胜感激。

我将执行以下操作:获取街道实体,并在创建获取的结果控制器时使用与地区实体的关系作为sectionNameKeyPath。您需要有一个清晰的地区排序方法,并且地区在查询时应该知道其在该层次结构中的位置

从您的图表可以清楚地看出,城市和地区标题之间没有空格。因此,您可以返回一个更大的、特殊的头,它将两者结合在一起。每个地区都必须知道它是城市中的第一个,并通知表视图数据源方法添加上述附加信息


请注意,您必须在headerinsection:的视图和headerinsection:的高度中考虑这一点。

我认为您试图通过NSFetchedResultsController实现的目标是不可能的,正如您指出的,sectionNameKeyPath确实限制了您。同时,作为一个用户,我很确定我更希望有一个城市的第一个列表,一旦选中,推另一个包含该地区的视图控制器,当选中时,再次显示街道。它将允许您的应用程序包含更多数据,而不会将用户丢失到一个无休止的大列表中。

该表视图的层次结构很难理解。第0节是否将上述图纸中的第1节和第2节分组?这在UITableView中是不可能的。您只能有2个级别;节标题和节标题的行。你需要添加一些巫术来达到你的愿望,但我不推荐。我真的很喜欢这个想法,并试图实现它。不幸的是,我只是按地区和街道名称排序,而不是按城市名称排序。这弄乱了我的tableview结构。拥有上述结构对我来说很重要。您还可以获取没有分区标题的地区,按国家排序,并使用数据源中的district.streets作为分区下的行。您是对的,但这是提供给我的设计,我不允许使用其他设计。所以我需要找到一种方法来处理它。