我有以下问题。我有一个由NSFetchedResultsController提供支持的UITableview。 它应该显示让我们说项目,文件夹和文件。没有比这更大的等级。所以一个项目有几个文件夹,有几个文件。 现在我的表格视图应显示按文件夹分组的文件。
所以我认为我的获取请求的谓词只是:
[NSPredicate predicateWithFormat:@"folder.project = %@", self.project];
然后我会使用MagicalRecord制作一个NSFetchedResultsController来制作这样的东西:
[File fetchAllGroupedBy:@"folder.name"
withPredicate:sectionPredicate
sortedBy:@"folder.name"
ascending:YES];
这基本上解决了一个大问题...如果文件夹中没有文件,我就不会得到该文件夹的部分(我需要!!!!)
所以我需要的是tableview还显示空文件夹的节标题:
Folder A
File 1
File 2
Folder B
Folder C
File 3
我可以在没有NSFetchedResultsController的情况下完成它,但是我喜欢它处理行和节的插入/删除非常好并且它会观察到变化......
帮助,谢谢 干杯, 乔治
答案 0 :(得分: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];
请注意,sectionNameKeyPath
设置为folder
,而不是folder.name
以支持具有相同名称的文件夹(如果不需要,且文件夹名称是唯一的,请使用{{ 1}})
3)在方法开头的folder.name
添加中:
-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
表视图:
1)实施:
File* file = (File*)anObject;
if (file.isFinal) {
return;
}
2)实施:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section];
return [sectionInfo numberOfObjects] - 1;
}
这应该为您提供所需的基本功能。 为了支持更复杂的行为,需要进行其他更改。