0

我有以下问题。我有一个由 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 的情况下做到这一点,但我喜欢它很好地处理行和部分的插入/删除,并且它可以观察变化......

感谢帮助,干杯,乔治

4

1 回答 1

1

解决方案确实有点复杂。我将尝试解释部分解决方案(没有嵌套文件夹,不支持部分排序​​顺序)

模型更改:
1)将父实体设置FolderFile(如果您使用虚拟项目则不需要)。
2)将BOOL字段添加isFinalFile实体。
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];
}

这应该为您提供所需的基本功能。为了支持更复杂的行为,需要进行额外的更改。

于 2013-04-18T16:27:18.283 回答