解决方案确实有点复杂。我将尝试解释部分解决方案(没有嵌套文件夹,不支持部分排序顺序)
模型更改:
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
支持具有相同名称的文件夹(如果不需要,并且文件夹名称是唯一的,请使用folder.name
)
3)在您-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
添加方法的开头:
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];
}
这应该为您提供所需的基本功能。为了支持更复杂的行为,需要进行额外的更改。