0

我有以下问题。我有一个由NSFetchedResultsController支持的UITableview。 它应该显示让我们说一个项目,文件夹和文件。没有比这更大的层次。所以一个项目有几个文件夹和那些有几个文件。 现在我的表格视图应该显示这些文件,按文件夹分组。NSFetchedResultsController并获得分组权利

,所以我想我的抓取请求谓词,简直是:

[NSPredicate predicateWithFormat:@"folder.project = %@", self.project]; 

我会再使用MagicalRecord通过使这样的事情作出NSFetchedResultsController:

[File fetchAllGroupedBy:@"folder.name" 
      withPredicate:sectionPredicate 
       sortedBy:@"folder.name" 
       ascending:YES]; 

这基本上与一期工程大问题...如果文件夹中没有文件,我不会得到该文件夹​​的一部分(我需要!!!!)

所以我需要的是标签leview也为空文件夹显示部分标题:

Folder A 
    File 1 
    File 2 
Folder B 
Folder C 
    File 3 

我能做到这一点没有NSFetchedResultsController,但我喜欢它处理的行和部分如此漂亮的插入/删除,它观察更改...

THX帮助, 干杯, 乔治

+0

我不认为有一个简单的(甚至中等复杂的)解决方案。 FRC不会创建空白部分。您必须修改表视图数据源方法,但FRC索引路径和表视图索引路径不再同步,这使得FRC委托方法(didChangeObject,...)变得复杂。 –

回答

1

的解决方案确实有点复杂。我会尽量解释的部分解决方案(没有嵌套的文件夹,而不是部分的排序顺序支持)

模型的变化:
1)设定的Folder父实体File(不是必要的,如果您使用的是虚拟物品) 。
2)将BOOL字段isFinal添加到File实体。
3)为实体生成类文件。
4)Folder.h实施-awakeFromInsert这样的:

- (void) awakeFromInsert 
{ 
    self.isFinal = YES; 
    self.folder = self;//You could also fabricate a dummy item 
} 

FetchedResultsController:
1)设置像这样的读取请求:

NSFetchRequest* request = [[NSFetchRequest alloc] initWithEntityName:@"File"]; 
NSSortDescriptor* terminalSort = [NSSortDescriptor sortDescriptorWithKey:@"isFinal" ascending:YES]; 
NSSortDescriptor* nameSort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; 
[request setSortDescriptors:@[terminalSort,nameSort]]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"folder.project == %@",project]] 
//Any additional settings 

2)初始化的FRC像这样:

self.fetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
            managedObjectContext:self.managedObjectContext 
             sectionNameKeyPath:@"folder"//or @"folder.<some unique property>" 
               cacheName:nil]; 

n otice该sectionNameKeyPath设置为folder,而不是folder.name支持具有相同名称的文件夹(如果这不是必需的,而且文件夹名是唯一的,使用folder.name)在-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:

3)添加之初该方法:

File* file = (File*)anObject; 
if (file.isFinal) { 
    return; 
} 

表视图:
1)实施:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section]; 
    return [sectionInfo numberOfObjects] - 1; 
} 

2)实现:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    id<NSFetchedResultsSectionInfo> sec = [self.fetchedResultsController sections][section]; 

    return [[[[sec objects] objectAtIndex:0] folder] name]; 
} 

这应该给你你需要的基本功能。 为了支持更复杂的行为,需要进行其他更改。

+0

嘿丹, 感谢您回答我的问题!所以基本上你是为每个文件夹插入一个虚拟物品,这是他自己? 缺乏不能排序我的部分是艰难的...没有可能改变这种情况,会有吗? – Georg

+0

正如我所说,为了按文件夹名称对文件夹进行排序,文件夹名称必须是唯一的,而'sectionNameKeyPath'将是'folder.name',否则您需要为文件夹创建一个唯一的属性匹配你所需的排序顺序,并使其成为你的'sectionNameKeyPath' –

+0

啊,好的...嗯,我尝试了这个解决方案,并会检查我是否喜欢它。事实上,我必须改变我的数据模型,以便ViewController可以按照他想要的方式显示数据,这对我来说并不好。我有一个TableViewController的版本,可以使用多个FRC,我想现在我会坚持使用它。当名称:NSManagedObjectContextObjectsDidChangeNotification被触发时,我只是更新这些FRC。我以这种方式放松了我的动画,但我会找出一些东西。但是这样我就不必乱用我的数据模型。 无论如何,非常感谢您的帮助! – Georg