NSFetchedResultsController - 父节点和祖父节点作为节标题

时间:2013-11-20 14:18:26

标签: ios uitableview core-data one-to-many nsfetchedresultscontroller

我正在尝试使用NSFetchedResultsController创建分段TableView。我的数据模型如下:

城市< --->>区< --->>街

我的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的上述外观,我需要更改什么?或者我完全错了,需要一个不同的结构?

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

2 个答案:

答案 0 :(得分:0)

我会执行以下操作:在创建获取的结果控制器时,获取Street实体并使用与District实体的关系作为sectionNameKeyPath。您需要有明确的方式来订购区域,并且区域在查询时应该知道它在此层次结构中的位置。

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

请注意,您必须同时在viewForHeaderInSection:heightForHeaderInSection:中对此进行说明。

答案 1 :(得分:0)

我认为你想要实现的是NSFetchedResultsController无法实现的,因为你指出sectionNameKeyPath确实限制了你。与用户同时,我非常确定我更愿意拥有一个曾经选择的城市的第一个列表,推送另一个包含该区域的视图控制器,并在选择时再次呈现街道。它将允许您的应用包含更多数据,而不会将您的用户丢失到一个无休止的列表中。