1

我正在尝试使用NSFetchedResultsController创建分段TableView。我的数据模型看起来就像是: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上述外观的改变?还是我完全错了,需要一个不同的结构?

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

+0

该表视图的层次结构很难理解。你在上面画的第0节分组第1节和第2节?这对于UITableView来说是不可能的。你只能有2个级别;部分标题和部分标题的行。你需要添加一些巫术来实现你的愿望,但我不会推荐它。 – Schoob

回答

0

我将执行以下操作:在创建提取结果控制器时,获取Street实体并使用与District实体的关系作为sectionNameKeyPath。你需要有一个明确的区域排序方式,一个区域在查询时应该知道它在这个层次结构中的位置。

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

请注意,您必须在viewForHeaderInSection:heightForHeaderInSection:中对此进行解释。

+0

我真的很喜欢这个想法,并试图实现它。不幸的是,我只是按地区和街道名称进行排序,而不是按城市名称排序。这搞乱了我的tableview结构。拥有上述结构对我来说很重要。 – Kritzli

+0

您也可以取得没有分区标题的分区,按国家分类,并在数据源中使用'district.streets'作为分区下的行。 – Mundi

0

我想你试图实现的是不可能的NSFetchedResultsController,因为你指出sectionNameKeyPath会限制你。在用户的同时,我非常确定我更愿意选择一个曾经选择过的城市的第一个列表,并推送另一个包含该地区的视图控制器,并在选定时再次显示街道。它将允许您的应用程序包含更多数据,而不会让用户进入一个无限大的列表。

+0

你是对的,但这是给我的设计,我不能使用另一个。所以我需要找到一个方法来处理它。 – Kritzli