的解决方案确实有点复杂。我会尽量解释的部分解决方案(没有嵌套的文件夹,而不是部分的排序顺序支持)
模型的变化:
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];
}
这应该给你你需要的基本功能。 为了支持更复杂的行为,需要进行其他更改。
我不认为有一个简单的(甚至中等复杂的)解决方案。 FRC不会创建空白部分。您必须修改表视图数据源方法,但FRC索引路径和表视图索引路径不再同步,这使得FRC委托方法(didChangeObject,...)变得复杂。 –