8

NSTreeControllerを使用してNSOutlineViewに表示したいツリーのようなモデルがあります。

NSTreeControllerの挿入関数と削除関数を使用してモデルツリーを変更する限り、バインディングを設定でき、すべてが正常に機能します。モデルツリーに直接挿入またはモデルツリーから削除しようとすると、NSOutlineViewが更新されない場合があります。

展開されたオブジェクトのグループにオブジェクトを挿入すると、次のように機能します。

ノードを挿入しています

新しいノードが表示されます

しかし、以前は子がなかったノードに最初のオブジェクトを追加しようとしても、何も起こりません。開示三角形が表示されていないため、展開して新しいノードを表示することはできません。

新しい子を挿入する

ここに画像の説明を入力してください

新しいオブジェクトでそのノードにカーソルを合わせると、ノードが展開され、問題なく2番目の子を追加できます。しかし、三角形はまだ見えません:

ここに画像の説明を入力してください

最後に、これらすべてのノードの親を閉じて再度開くと(リロードをトリガーすると)、三角形が突然表示されます。

ここに画像の説明を入力してください

そのため、三角形を表示するためにNSOutlineViewの行を手動でリロードする必要があるのか​​、それとも何かを台無しにしているのか疑問に思いました。ありがとう!!

アップデート:

私のNodeクラスに、次のような新しい子を追加します。

- (void)addChild:(MyNode *)child {
    [self willChangeValueForKey:@"childNodes"];
    [children addObject:child];
    [self didChangeValueForKey:@"childNodes"];
}

そして、これらも実装しました(NSTreeController用にIBで設定しました)。

- (NSArray *)childNodes {
    return [NSArray arrayWithArray:children];
}

- (NSInteger)countOfChildNodes {
    return [children count];
}

- (BOOL)nodeIsLeaf {
    return [children count] < 1;
}

childNodesこれは(特に)あまり最適化されていないことは知っていますが、最終バージョンでは子がC配列に格納されるため、現時点では実験中です。

更新2:

他の2つのプロパティについてもKVO通知を送信しようとしましたが、それも役に立ちませんでした。

- (void)addChild:(MyNode *)child {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    [self willChangeValueForKey:@"nodeIsLeaf"];
    [self willChangeValueForKey:@"countOfChildNodes"];
    [self willChangeValueForKey:@"childNodes"];
    [children addObject:child];
    [self didChangeValueForKey:@"childNodes"];
    [self didChangeValueForKey:@"countOfChildNodes"];
    [self didChangeValueForKey:@"nodeIsLeaf"];
}
4

1 に答える 1

2

モデルへのすべての更新がKey-ValueObservingに準拠した方法で実行されることを確認する必要があります。

Cocoaバインディングプログラミングトピック:Cocoaバインディングのトラブルシューティング

于 2012-05-10T00:16:34.743 に答える