gpt4 book ai didi

objective-c - NSOutlineView 仅显示 NSTreeController 层次结构的前 2 层

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:29 25 4
gpt4 key购买 nike

我正在使用 NSTreeController 填充 NSOUtlineView

NSTreeController 是一个 3 级层次 Controller (CBMovie、CBDisc 和 CBEpisode),但只有前 2 级显示在大纲 View 中。

所有对象的实现都是相同的:我已经实现了指定子对象、子对象数量以及对象是否为叶子的方法。为所有对象正确调用这些方法(对于那些未显示的对象,孙子:CBEpisode)。

在大纲 View 中,前 2 级的所有内容都正确显示。但是永远不会显示孙子,我无法选择扩展他们的 parent 来看到他们。我只能看到 CBMovie 和 CBDiscs。

我想知道是否还缺少其他设置,关于节点在 NSTreeControllers 或 NSOutlineView 配置中可以扩展多深。

以下:在三个节点之一中实现。每个节点类都有不同的路径到它的 child 。这是在 -(NSArray*)children 方法中指定的(正确调用)。

-(NSArray*)children
{
return [[self Episodes] allObjects];
}

-(int)childrenCount
{
return [[self Episodes] count];
}

-(BOOL)isLeaf
{
return ![[self Episodes] count];
}

日志代码的输出。数据源 NSTreeController 似乎具有正确的结构。

   CBMovie
CBDisc
CBEpisode
CBEpisode
CBMovie
CBDisc
CBDisc
CBDisc
CBDisc
CBMovie
CBDisc
CBEpisode
CBEpisode

这就是我填充 NSOutlineView(基于单元格)的方式。我不使用数据源方法,但我以编程方式绑定(bind)它。

NSMutableDictionary *bindingOptions = [[NSMutableDictionary alloc] initWithCapacity:2];

if (metadata.valueTransformer) {
[bindingOptions setObject:metadata.valueTransformer forKey:NSValueTransformerNameBindingOption];
}
[bindingOptions setObject:[NSNumber numberWithBool:NO] forKey:NSCreatesSortDescriptorBindingOption];
[bindingOptions setObject:[NSNumber numberWithBool:NO] forKey:NSRaisesForNotApplicableKeysBindingOption];

[newColumn bind:@"value" toObject:currentItemsArrayController withKeyPath:[NSString stringWithFormat:@"arrangedObjects.%@", metadata.columnBindingKeyPath] options:bindingOptions];

最佳答案

检查 NSTreeController

The NSTreeController is a 3 levels hierarchy controller, but only the first 2 levels are displayed in the outline view.

您是否确认所有三个级别都已加载到您的 NSTreeController 中?您可以通过使用以下扩展名将其内容记录到控制台来执行此操作。如果此代码产生的输出与您的大纲 View 中显示的相匹配,则问题可能出在 NSTreeController 端,而不是大纲 View 。

#import "NSTreeController+Logging.h"

@implementation NSTreeController (Logging)

// Make sure this is declared in the associated header file.
-(void)logWithBlock:(NSString * (^)(NSTreeNode *))block {

NSArray *topNodes = [self.arrangedObjects childNodes];
[self logNodes:topNodes withIndent:@"" usingBlock:block];
}

// For internal use only.
-(void)logNodes:(NSArray *)nodes
withIndent:(NSString *)indent
usingBlock:(NSString * (^)(NSTreeNode *))block {

for (NSTreeNode * each in nodes) {
NSLog(@"%@%@", indent, block(each));
NSString *newIndent = [NSString stringWithFormat:@" %@", indent];
[self logNodes:each.childNodes withIndent:newIndent usingBlock:block];
}
}

@end

上面的代码不用调整,只需要用自定义的block调用即可:

-(void)logIt {

[self.treeController logWithBlock:^NSString *(NSTreeNode * node) {

// This will be called for every node in the tree. This implementation
// will see the object's description logged to the console - you may
// want to do something more elaborate.
NSString *description = [[node representedObject] description];
return description;
}];

}

检查 NSOutlineView

如果所有数据似乎都已正确加载到 NSTreeController 中,您可以查看如何填充 NSOutlineView。委托(delegate)方法 -[NSOutlineViewDelegate outlineView:viewForTableColumn:item] 是一个很好的起点。 item 参数是 NSTreeNode 实例,因此,在返回相关 View 之前,您可以查看此节点并确保它按预期运行。在您的情况下,您应该仔细检查代表 CBDisc 对象的 item 对象的属性。 (您可能需要单击披露按钮才能为相关对象触发此方法。)

-(NSView *)outlineView:(NSOutlineView *)outlineView
viewForTableColumn:(NSTableColumn *)tableColumn
item:(id)item {

NSTreeNode *node = (NSTreeNode *)item;
NSManagedObject *representedObject = (NSManagedObject *)node.representedObject;

// Query the node
NSLog(@"%@ <%@>", representedObject.description, [representedObject class]);
NSLog(@" node is a leafNode: %@", node.isLeaf ? @"YES" : @"NO");
NSLog(@" node has child-count of: %lu", (unsigned long)node.childNodes.count);

// Query the NSManagedObject
// your stuff here...

// This is app-specific - you'll probably need to change the identifier.
return [outlineView makeViewWithIdentifier:@"StandardTableCellView" owner:self];
}

关于objective-c - NSOutlineView 仅显示 NSTreeController 层次结构的前 2 层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30123043/

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