0

クラスへのバインディングを持つ NSTreeController があります。

NSOutlineView dirTree は NSTreeController にバインドします

具体的には、Outline View Content は ArrangedObjects にバインドします

これはうまく機能しているように見えますが、reloadData に応答しない理由を突き止めようとしています。

NSTreeController キー パスは次のとおりです。

Children    subDirectories
Count       numberOfSubDirs

これらは以下にリストされています。numberOfSubDirs は、サブディレクトリの単純な数を返します (診断表示が追加されています)。

- (NSArray *)subDirectories {
    if (subDirectories == nil) {
        [self loadSubDirectories];
    }
    return subDirectories;
}

- (NSInteger)numberOfSubDirs {
    NSArray *tmp = [self subDirectories];
    NSLog(@"numberOfSubDirs %@ %d", [self relativePath], [tmp count]);
    return [tmp count];
}

データを更新するリフレッシュ関数を呼び出すと、[dirTree reloadData] が呼び出されます。次の出力が得られます:-

Reload Data
numberOfSubDirs Shared 7
numberOfSubDirs Adobe 1
numberOfSubDirs bZTree2 0
numberOfSubDirs Ian Documents 25
numberOfSubDirs Library 1
numberOfSubDirs NET 1
numberOfSubDirs TSA 12
numberOfSubDirs Wacom 1

ディレクトリを削除して (Finder の外部で)、更新機能を呼び出すと、次の出力が得られます。

Reload Data
numberOfSubDirs Shared 6
numberOfSubDirs Adobe 1
numberOfSubDirs bZTree2 0
numberOfSubDirs Ian Documents 25
numberOfSubDirs Library 1
numberOfSubDirs NET 1
numberOfSubDirs TSA 12
numberOfSubDirs Wacom 1

NSTreeController は、親 "Shared" で numberOfSubDirs を呼び出し、現在 6 つのサブディレクトリがあることを正しく通知されます。

ただし、削除されたアイテム「bZTree2」を含む 7 つのサブディレクトリを照会し、存在する 6 つだけを表示するように表示を更新しません。

4

1 に答える 1

1

NSTreeController-reloadDataそのメソッドを実装していないため、応答しません。インスタンスで呼び出そうとすると、実行時例外とコンパイラ警告の両方が表示されNSTreeControllerます。

NSOutlineViewは に応答しますが、 がデータ ソースを使用し-reloadDataない限り何もしません。NSOutlineView使っNSTreeControllerていても何の役にも立たない。

ファイル システム ビューを作成しているように見えるので、 を使用するのではなく、データ ソース ルートを使用することを強くお勧めしますNSTreeController。これにより、多くの手間が省けます。

Apple には、これを行うためのドキュメントサンプル コードもあります。

于 2011-09-15T03:54:26.017 に答える