表示されるデータに基づいて、NSTableViewの一部の列を動的に非表示/表示したいのですが、基本的に、列が空の場合は、列を非表示にします。現在、テーブルのデリゲートとしてコントローラークラスをテーブルに入力しています。
何か案は?Interface Builderで列を非表示に設定できるように見えますが、列を調べて空かどうかを確認するのに良い時期ではないようです。テーブル内のすべてのデータが入力される前/後に呼び出されます。
Mac OS X v10.5 以降では、NSTableColumnのsetHidden:
セレクターがあります。
これにより、識別子を使用して列を動的に非表示/表示できます。
NSInteger colIdx;
NSTableColumn* col;
colIdx = [myTable columnWithIdentifier:@"columnIdent"];
col = [myTable.tableColumns objectAtIndex:colIdx];
[col setHidden:YES];
私はこれをバインディングで行いましたが、Interface Builder ではなくプログラムでセットアップしました。
この疑似スニペットは、その要点を示しているはずです。
NSTableColumn *aColumn = [[NSTableColumn alloc] initWithIdentifier:attr];
[aColumn setWidth:DEFAULTCOLWIDTH];
[aColumn setMinWidth:MINCOLWIDTH];
[[aColumn headerCell] setStringValue:columnLabel];
[aColumn bind:@"value"
toObject:arrayController
withKeyPath:keyPath
options:nil];
[tableView addTableColumn:aColumn];
[aColumn release];
もちろん、フォーマッターなども追加できます。
現時点では完全な答えはありませんが、バインディングを調べてください。一般に、CocoaBindingsを使用してあらゆる種類のことを行うことができます。
NSTableColumnの可視性バインディングはありませんが、幅を0に設定できる場合があります。
次に、それをNullプレースホルダーにバインドし、この値を0に設定できますが、他のプレースホルダーを適切な値に設定することを忘れないでください。
(私が言ったように、これはほんの始まりであり、微調整が必要な場合があります)。
すべてのデータが入力されることは一度もありません。NSTableViewはデータを保存せず、データソース(またはバインディングを使用している場合はバインドされたオブジェクト)から動的にデータを要求します。データソースから取得したデータを使用して描画し、破棄します。たとえば、テーブルが表示されていないもののデータを要求するのを見る必要はありません。
データソースを使用しているようですね。データが変更された場合、テーブルで-reloadDataを呼び出すのはユーザーの責任ですが、これは少し誤称です。それは「すべてを無効にする」のようなものです。
つまり、データがいつ変更されるかをすでに知っている必要があります。これが、非表示にする列を計算できるポイントです。
NSTable は、テーブルを描画するクラスです。あなたが言ったように、テーブルをデリゲートとして指定するクラスがあり、このクラスは表示するデータをテーブルにフィードします。テーブル データをデリゲート クラス内の NSArray として格納すると、1 つの列が空かどうかを簡単に確認できるはずですよね。そして NSArray はデリゲート メソッドを介してクラスにいくつの列があるかを尋ねます。そのため、尋ねられたときに、データを持っている列の数を探して、内部に保存する列の実際の数ではなくその数を報告してから、要求されたときに報告してください。 (列、行) のデータを提供し、空の列をスキップするだけです。
@amrox - あなたの提案を正しく理解していれば、テーブルの NSTableColumns の非表示プロパティに値をバインドする必要があると言っていますか? それはうまくいくようですが、 isHidden および setHidden メッセージが列の可視性を制御するため、NSTableColumn に隠しプロパティがあるとは思いません。 (これはかなり可能です)。