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