gpt4 book ai didi

ios - NSFetchedResultsController 并正确分组

转载 作者:行者123 更新时间:2023-11-29 03:59:32 25 4
gpt4 key购买 nike

我有以下问题。我有一个由 NSFetchedResultsController 提供支持的 UITableview。它应该显示一个项目、文件夹和文件。没有比这更大的层次结构了。因此,一个项目有多个文件夹,这些文件夹有多个文件。现在我的表格 View 应该显示这些文件,并按文件夹分组。

所以我认为我的获取请求的谓词只是:

[NSPredicate predicateWithFormat:@"folder.project = %@", self.project];

然后我将使用 MagicalRecord 通过制作如下内容来制作 NSFetchedResultsController:

[File fetchAllGroupedBy:@"folder.name"
withPredicate:sectionPredicate
sortedBy:@"folder.name"
ascending:YES];

这基本上可以解决一个大问题...如果文件夹中没有文件,我将无法获得该文件夹的部分(我需要!!!)

所以我需要的是表格 View 来显示空文件夹的节标题:

Folder A
File 1
File 2
Folder B
Folder C
File 3

我可以在没有 NSFetchedResultsController 的情况下做到这一点,但我喜欢它可以很好地处理行和节的插入/删除,并且它可以观察更改......

感谢您的帮助,干杯,格奥尔格

最佳答案

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

模型变化:
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;
}

表格 View :
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];
}

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

关于ios - NSFetchedResultsController 并正确分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16064051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com