【问题标题】:How can I get all childs, grandchilds and grandgrandchilds of an selected NSTreeController Object如何获取选定 NSTreeController 对象的所有子项、孙子项和孙子项
【发布时间】:2011-09-29 21:27:50
【问题描述】:

我有这个简化模型:http://i.imgur.com/EAug3.png

我在 NSOutlineView 中排序这些元素并由 NSTreeController 控制。

所以我创建了一些虚拟数据:

文件夹 1 |___子文件夹1 |___元素1 |___元素2 |___ 子文件夹2 |___子子文件夹1 |___元素3

现在的问题是: 如果我选择 Folder1,如何获得一个包含 Element1、Element2、Element3 的数组,如果我选择 Subfolder1,我如何获得一个包含 Element1 和 Element2 的数组?

我的第一种方法是创建一个新的 NSArrayController 绑定到我的 NSTreeController 对象的自定义属性(我为此派生了一个类),但该属性只调用了一次,之后不再更新。 我的第二种方法是编写一个 Fetch Predicate,但我没有成功... :(

有什么想法吗?

【问题讨论】:

    标签: objective-c cocoa filter nstreecontroller


    【解决方案1】:

    为了确保对结构的更改反映在您的自定义属性中,您必须定义键和键路径之间的依赖关系(请参阅 -keyPathsAffectingValueForKey:)。但是,由于您的键路径是基于动态路径的,因此您不能真正这样做,否则您最终会得到一个不断增长的依赖项列表。

    因此,您必须更多地手动操作。每次更改树中的节点时,都必须向自定义树控制器对象发送 -willChangeValueForKey: 和 -didChangeValueForKey: 消息,这将触发扁平化树数组的重新加载。只需确保您实际上也重新创建了数组。我假设您正在遍历树并手动将其展平。

    【讨论】:

    • 对不起,我不能投票给你(我没有足够的声誉),但这解决了我的问题 THX!!! :) - (void)didChangeValueForKey:(NSString *)key { if ([key isEqualToString:@"selection"]) { [self didChangeValueForKey:@"allSubelements"]; } [超级 didChangeValueForKey:key]; }
    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多