0

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;
}

結果:

親が折りたたまれたアウトライン ビュー

親が折りたたまれたアウトライン ビュー

親が展開され、子が上に描画されたアウトライン ビュー

親が展開され、子が上に描画されたアウトライン ビュー

4

1 に答える 1

0

それは Core Data 関連の問題ではありません。それはNSTreeControllerの何かです。データ モデルが間違った値を返したとしても、そのように互いに重ねて描画するべきではありません。

ツリー コントローラがどこかに不適切にバインドされています。「親」を表示する単一の最上位ノードのみを持つ必要があります。代わりに、「名前」を表示する 2 番目のトップ ノードがあります。

于 2011-08-09T21:46:50.243 に答える