Macos 以编程方式将NSTreeController绑定到NSOutlineView

Macos 以编程方式将NSTreeController绑定到NSOutlineView,macos,cocoa-bindings,nsoutlineview,nstreecontroller,Macos,Cocoa Bindings,Nsoutlineview,Nstreecontroller,为了支持不同于Swift和ObjC的语言,我需要了解如何为NSOutlineView设置NSTreeController 我已经能够在代码中创建NSOutlineView,并提供我自己的数据源委托。但现在我喜欢切换到使用NSTreeController。我很难弄清楚如何设置绑定和其他关系,因为我能找到的所有示例都假设使用Interface Builder进行设置。我想我现在已经弄清楚了基础知识。作为记录,以下是我必须添加到我的视图控制器中的内容,该视图控制器已经管理了一个NSOutlineVie

为了支持不同于Swift和ObjC的语言,我需要了解如何为
NSOutlineView
设置
NSTreeController


我已经能够在代码中创建
NSOutlineView
,并提供我自己的数据源委托。但现在我喜欢切换到使用
NSTreeController
。我很难弄清楚如何设置绑定和其他关系,因为我能找到的所有示例都假设使用Interface Builder进行设置。

我想我现在已经弄清楚了基础知识。作为记录,以下是我必须添加到我的视图控制器中的内容,该视图控制器已经管理了一个NSOutlineView,我自己在其中管理数据源:

为树节点创建一个类:

@interface DataNode : NSObject {}
    @property (retain) NSMutableArray *children;
    @property (retain) NSString *firstText;   // text for 1st column
    @property (retain) NSString *secondText;  // text for 2nd column
@end

@implementation DataNode
- (instancetype)init {
    self.children = [NSMutableArray array];
    return self;
}
- (BOOL) isLeaf {
    return self.children.count == 0;
}
@end
将以下属性添加到视图控制器:

@property (nonatomic, retain) NSTreeController *treeController;
@property (nonatomic, retain) NSMutableArray *treeContents;
初始化树控制器,例如从视图控制器的
awakeFromNib

self.treeContents = [NSMutableArray array]; // holds the add nodes

self.treeController = [[NSTreeController alloc] init];
[self.treeController setLeafKeyPath:@"isLeaf"]; // refers to DataNode
[self.treeController setChildrenKeyPath:@"children"]; // refers to DataNode

// set up the bindings
[self.treeController bind:@"contentArray" toObject:self withKeyPath:@"treeContents" options:@{NSRaisesForNotApplicableKeysBindingOption:@YES, NSConditionallySetsEditableBindingOption:@YES}];
[self.table bind:@"content" toObject:self.treeController withKeyPath:@"arrangedObjects" options:@{NSAlwaysPresentsApplicationModalAlertsBindingOption:@YES}];
[self.table bind:@"selectionIndexPaths" toObject:self.treeController withKeyPath:@"selectionIndexPaths" options:@{}];
[self.table bind:@"sortDescriptors" toObject:self.treeController withKeyPath:@"sortDescriptors" options:@{}];
将节点添加到树的根目录:

DataNode *node = [[DataNode alloc] init];
node.firstText = [NSString stringWithFormat:@"1 - %d", i1];
node.secondText = [NSString stringWithFormat:@"2 - %d", i1];
NSIndexPath *loc = [NSIndexPath indexPathWithIndex:self.contents.count]; // appends to end of list
[self.treeController insertObject:node atArrangedObjectIndexPath:loc];
由于我的NSOutlineView是基于单元格的,因此我还必须不断实现数据源方法,以便为单元格提供值,因为我无法确定如何对此进行绑定:

-(NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
    return 0;   // never called (due to using NSTreeController)
}

-(id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
    return nil; // never called (due to using NSTreeController)
}

-(BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
    return NO;  // never called (due to using NSTreeController)
}

-(id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
    DataNode *node = [item representedObject];
    return [node valueForKey:tableColumn.identifier];
}

objectValueForTableColumn
方法假定表列的标识符分别设置为
firstText
secondText

IB中几乎每个属性都有对应的属性。绑定可以在代码中设置。哪个属性或绑定是问题所在?我从未使用过绑定,所以我从零开始。希望有人能剪下一段代码来分享这项任务。现在我几乎完成了这个问题-刚才我发现已经有这样一个问题和有用的示例代码:-奇怪的是,我以前没有发现。我仍然可以更广泛地回答这个问题,也可以删除这个问题。苹果为绑定名称提供常量:
NSContentBinding
NSSelectionIndexPathsBinding
NSSortDescriptorsBinding
等。在Swift中,
NSContentBinding
被移动到
NSBindingName.content
。所有其他绑定名称都被同等地移动到适当的位置。