gpt4 book ai didi

cocoa - 如何将 NSTreeController、NSOutlineView 和 Core Data 与 "invisible"根项一起使用?

转载 作者:行者123 更新时间:2023-12-03 16:20:55 24 4
gpt4 key购买 nike

我有一个核心数据模型,它由特定实体的简单树组成,该实体具有两个关系:。我有一个 NSTreeController 管理模型,并有一个 NSOutlineView 绑定(bind)到 NSTreeController

我的问题是我需要一个根对象,但这不应该显示在大纲 View 中,只有它的子对象应该显示在大纲 View 的顶层。如果我将 Interface Builder 中的 NSTreeController 的获取谓词设置为 parent == nil,则一切正常,除了根项在大纲 View 中作为顶级项可见之外.

我的实体有一个属性 isRootItem,仅适用于根项目。

我的模型如下所示:

Node 1
|
+-Node 2
| |
| +-Node 5
|
Node 3
|
Node 4

大纲 View 应如下所示:

Outline View Image
(来源:menumachine.com)

我需要在大纲 View 的顶层显示节点 2、3 和 4(节点 1 不应该可见),但它们的父节点仍然是“节点 1”。节点 1 的 isRootItem 值为 YES,所有其他节点的 NO 值为 NO

如果我将树 Controller 的获取谓词设置为 parent.isRootItem == 1,这会正确显示树,但是一旦我将新项目添加到顶层,它就会失败,因为树 Controller 不会将“不可见”根项指定为新项的父项。

有没有办法让 NSTreeController/NSOutlineView 组合在这种情况下工作?

最佳答案

我最终所做的是子类化 NSTreeController 并覆盖 -insertObject:atArrangedObjectIndexPath: ,如果要插入的对象被插入到顶层对象,则直接将父对象设置为我的根对象树。这似乎工作可靠。

显然需要更多的工作来处理移动项目和插入多个项目,但这似乎是最好的方法。

- (void)insertObject:(id)object atArrangedObjectIndexPath:(NSIndexPath *)indexPath
{
NodeObject* item = (NodeObject*)object;
//only add the parent if this item is at the top level of the tree in the outline view
if([indexPath length] == 1)
{
//fetch the root item
NSEntityDescription* entity = [NSEntityDescription entityForName:@"NodeObject" inManagedObjectContext:[self managedObjectContext]];
NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init]; //I'm using GC so this is not a leak
[fetchRequest setEntity:entity];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"isRootItem == 1"];
[fetchRequest setPredicate:predicate];

NSError* error;
NSArray* managedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];

if(!managedObjects)
{
[NSException raise:@"MyException" format:@"Error occurred during fetch: %@",error];
}

NodeObject* rootItem = nil;
if([managedObjects count])
{
rootItem = [managedObjects objectAtIndex:0];
}
//set the item's parent to be the root item
item.parent = rootItem;
}
[super insertObject:object atArrangedObjectIndexPath:indexPath];
//this method just sorts the child objects in the tree so they maintain their order
[self updateSortOrderOfModelObjects];
}

关于cocoa - 如何将 NSTreeController、NSOutlineView 和 Core Data 与 "invisible"根项一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1678637/

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