的解決方案確實有點複雜。我會盡量解釋的部分解決方案(沒有嵌套的文件夾,而不是部分的排序順序支持)
模型的變化:
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,...)變得複雜。 –