Lap*_*dus 5 treeview core-data objective-c ios
核心数据树结构有很多主题,但我还有一些问题.
我正在尝试创建的是一个简单的目录结构.(包含子文件夹的子文件夹的文件夹,......以及稍后的文件.)
我现在有这个文件夹实体:

我正在添加这样的文件夹:[显然这是虚拟数据,这将在以后动态插入]
// root 1
Folder *root1 = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:context];
root1.name = @"Root 1";
root1.parent = nil;
// folder 1 in root 1
Folder *subFolder1 = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:context];
subFolder1.name = @"Folder 1 in root 1";
subFolder1.parent = root1;
root1.children = [NSSet setWithObjects: subFolder1, nil];
Run Code Online (Sandbox Code Playgroud)
现在我想为每个文件夹创建一个ViewController,然后为每个子文件夹打开一个新的ViewController.(或无限的UITabelView)
当我用这段代码循环文件夹实体时:
NSArray *folders = [context executeFetchRequest:fetchRequest error:&error];
for(Folder *folder in folders){
NSLog(@"Profile: %@", folder.name);
}
Run Code Online (Sandbox Code Playgroud)
我立刻得到了所有的文件夹.
所以问题是:如何在树形结构中记录它?所以我可以先为所有根文件夹创建一个ViewController,然后为每个子文件夹创建另一个ViewController等等...(换句话说:我如何读取这个实体,因为我将它放在UITabelView中)
您没有详细说明如何构造获取请求,但关键是使用a NSPredicate来过滤结果,以便Folder在任何给定时间包含感兴趣的对象.为此,您需要在视图控制器中存储对当前父文件夹的引用:
@property (readwrite, strong) Folder *parentFolder;
Run Code Online (Sandbox Code Playgroud)
如果你在树的根部,这将是nil,否则它将引用您正在显示其内容的当前文件夹.
然后在谓词中使用此属性:
NSFetchRequest *fetchRequest = ...
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"parent = %@", self.parentFolder];
[fetchRequest setPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)
当你在根目录中,将选择的唯一实例Folder,其中parent的nil(即只有root级别的对象).在所有其他层面,只选择Folders其中parent的任何当前的父文件夹的.
作为旁注,在示例代码中,没有必要设置subFolder1.parent 和 root1.children.核心数据逆向关系管理意味着您只需要在关系的一侧执行此操作.这两种方式都没有任何损害(除了非常小的性能影响),但它也没有用处.
| 归档时间: |
|
| 查看次数: |
1282 次 |
| 最近记录: |