Macos 如何使用Cocoa绑定实现基于视图的源代码列表(NSOutlineView)的示例?

Macos 如何使用Cocoa绑定实现基于视图的源代码列表(NSOutlineView)的示例?,macos,cocoa,cocoa-bindings,nsoutlineview,Macos,Cocoa,Cocoa Bindings,Nsoutlineview,有没有人找到一个清晰、简明的示例或指南,说明如何使用Lion中介绍的基于视图的NSOutlineView实现源代码列表?我看过苹果公司的示例项目,但没有任何方向感或解释,我发现很难准确理解它们是如何工作的 我知道如何使用优秀的PXSourceList作为后备,但如果可能的话,我真的很想开始使用基于视图的源列表。您使用cocoa bindings标记了它,所以我认为您的意思是使用bindings。我迅速举了一个例子。从Xcode中新的非基于文档的Cocoa应用程序模板开始。随便你叫什么都行。首先,

有没有人找到一个清晰、简明的示例或指南,说明如何使用Lion中介绍的基于视图的NSOutlineView实现源代码列表?我看过苹果公司的示例项目,但没有任何方向感或解释,我发现很难准确理解它们是如何工作的


我知道如何使用优秀的PXSourceList作为后备,但如果可能的话,我真的很想开始使用基于视图的源列表。

您使用cocoa bindings标记了它,所以我认为您的意思是使用bindings。我迅速举了一个例子。从Xcode中新的非基于文档的Cocoa应用程序模板开始。随便你叫什么都行。首先,我添加了一些代码,使一些假数据绑定到。下面是我的AppDelegate头的外观:

#import <Cocoa/Cocoa.h>

@interface SOAppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;

@property (retain) id dataModel;

@end
#import "SOAppDelegate.h"

@implementation SOAppDelegate

@synthesize window = _window;
@synthesize dataModel = _dataModel;

- (void)dealloc
{
    [_dataModel release];
    [super dealloc];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application

    // Make some fake data for our source list.
    NSMutableDictionary* item1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 1", @"itemName", [NSMutableArray array], @"children", nil];
    NSMutableDictionary* item2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2", @"itemName", [NSMutableArray array], @"children", nil];
    NSMutableDictionary* item2_1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.1", @"itemName", [NSMutableArray array], @"children", nil];
    NSMutableDictionary* item2_2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.2", @"itemName", [NSMutableArray array], @"children", nil];
    NSMutableDictionary* item2_2_1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.2.1", @"itemName", [NSMutableArray array], @"children", nil];
    NSMutableDictionary* item2_2_2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.2.2", @"itemName", [NSMutableArray array], @"children", nil];
    NSMutableDictionary* item3 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 3", @"itemName", [NSMutableArray array], @"children", nil];

    [[item2_2 objectForKey: @"children"] addObject: item2_2_1];
    [[item2_2 objectForKey: @"children"] addObject: item2_2_2];

    [[item2 objectForKey: @"children"] addObject: item2_1];
    [[item2 objectForKey: @"children"] addObject: item2_2];

    NSMutableArray* dataModel = [NSMutableArray array];

    [dataModel addObject: item1];
    [dataModel addObject: item2];
    [dataModel addObject: item3];

    self.dataModel = dataModel;
}

@end
我创建的伪数据结构没有什么特别的意义,我只是想展示一些有几个子级别的东西,等等。唯一重要的是在Interface Builder的绑定中指定的键路径与数据伪数据中的键在本例中对齐

然后选择MainMenu.xib文件。在IB编辑器中,执行以下步骤:

使用对象库Ctrl-Cmd-Opt-3将NSTreeController添加到.xib。 选择NSTreeController,并在此示例中使用属性检查器Cmd-Opt-4设置关键路径>子对象到子对象;对于您的数据,这应该是返回子对象数组的内容。 在仍然选择NSTreeController的情况下,使用绑定检查器Cmd-Opt-7将内容数组绑定到AppDelegate,模型键路径为dataModel 接下来,使用对象库Ctrl-Cmd-Opt-3将NSOutlineView添加到.xib中。 将其布置在窗户内,使其达到您满意的程度,通常为窗户的整个高度,与左侧齐平 选择NSOutlineView注意:第一次单击它时,您可能选择了包含它的NSScrollView。再次单击它,您将深入到NSOutlineView本身。请注意,如果您扩大IB编辑器左侧所有对象所在的区域,这将更加容易-这允许您将对象视为树,并以这种方式导航和选择它们。 使用属性检查器Cmd-Opt-4设置NSOutlineView: 内容模式:基于视图 栏目:1 亮点:源列表 使用绑定检查器Cmd-Opt-7将内容绑定到树控制器,控制器键:arrangedObjects这是基于视图的NSTableView/NSOutlineViews的行为开始与基于NSCell的行为发生分歧的地方 在6中提到的对象列表中,展开NSOutlineView的视图层次结构并选择Static Text-Table view单元格。 使用绑定检查器Cmd-Opt-7将值绑定到表单元格视图,模型键路径:objectValue.itemName我在伪数据中使用了itemName,您可能希望使用与数据项名称对应的键 保存。跑您应该会看到一个源列表,一旦扩展了包含子节点的节点,您可能会看到如下内容:

如果您在Apple Developer程序中,您应该能够访问。有一个专门用于处理基于视图的NSTableView和NSOutlineView,它包括相当全面的绑定


希望有帮助

看看这个例子


仅供参考,WWDC 2011视频是第120课时,题为“基于视图的NSTableView”。对于那些使用这种方式的人:还要考虑:这种方式也可以在Leopard和SnowLeopard中运行吗?基于视图的NSTableView和NSOutlineViews对Lion来说是新的,所以我猜它们对Leo和SnowLeo不起作用。基于单元格的NSTableViews和NSOutlineViews可以工作,尽管创建和绑定它们的步骤有些不同。@Olivier我也有同样的问题,答案如下:。有点旧的帖子,但希望这能帮助别人!