NSOutlineView + NSTreeController + Core Data を使用すると、アウトライン ビューのレイアウトが奇妙になります。下の画像でわかるように、アウトライン ビューは、「親」が展開されたときに「子」用のスペースを作成しますが、代わりに「親」の上に「子」を描画します。押されたときにビューを正しく描画する [outlineVIew reloadData] メソッドを呼び出すボタンを作成しました。
コア データ モデル:
- 親
- 子供
- 葉
- 名前
私のxibセットアップ:
- NSOutlineViewデリゲートはファイルの所有者に設定されています
- NSTreeController はドキュメントの Core Data コンテキストにバインドされています
- NSTableColumn は NSTreeController.arrangedObjects にバインドされています
- NSTextField は NSTableCellView.objectValue.name にバインドされています
NSPersistentDocument クラス:
- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
[super windowControllerDidLoadNib:aController];
Node *parent = [self createNodeOfTypeString:@"Node"];
Node *child = [self createNodeOfTypeString:@"Node"];
parent.name = @"Parent";
parent.isLeaf = NO;
[parent addChildrenObject:child];
child.name = @"Child";
child.isLeaf = YES;
[self.treeController addObject:parent];
}
- (id)outlineView:(NSOutlineView *)ov objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
return [item representedObject];
}
- (NSView *)outlineView:(NSOutlineView *)ov viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
if ([[item representedObject] isKindOfClass:[Node class]]) {
// Everything is setup in bindings
return [ov makeViewWithIdentifier:@"MainCell" owner:self];
}
return nil;
}
結果:
親が折りたたまれたアウトライン ビュー
親が展開され、子が上に描画されたアウトライン ビュー