2008-09-16 12 views
2

表示されるデータに基づいてNSTableViewの列の一部を表示/非表示にしたい - 基本的に列が空の場合は列を空にする隠された私は現在、テーブルの代理人としてコントローラクラスをテーブルに設定しています。NSTableViewの列を動的に非表示にする

アイデア?私は、Interface Builderで列を非表示にすることができますが、カラムを通過して空であるかどうかをチェックするのは良い方法ではないようです。表のすべてのデータが移入される前/後に呼び出されます。

答えて

0

NSTableは、テーブルをペイントするクラスに過ぎません。あなた自身が言ったように、あなたはテーブルをデリゲートとして与えるクラスをいくつか持っていて、このクラスは表示するデータをテーブルに送ります。デリゲートクラス内にNSArrayのようにテーブルデータを格納する場合は、1つの列が空であるかどうかを簡単に調べることができます。そして、NSArrayはデリゲートメソッドを介してクラスにデータベースメソッドの数を問い合わせているので、質問が出されたときに、データを持つ列の数を探し、内部に格納している実際の列数ではなく、 (列、行)のデータを提供し、空の列をスキップするだけです。

+0

多くの意味...私はおそらくそれを考えていたはずです。私はココアでより多くの経験が必要だと思います。助けてくれてありがとう。 :) – Andy

1

私はこの時点で完全な答えを持っていませんが、バインディングを調べます。ココアバインディングでは、一般的にあらゆることが可能です。

はNSTableColumnのために結合一切可視性はありませんが、あなたは、あなたがNullプレースホルダにバインドすることができますを0

の幅を設定し、この値を0に設定することができるかもしれ - それに忘れてはいけません他のプレースホルダを適切な値に設定します。

(私が言ったように、これはほんの始まりに過ぎず、いくつかの調整が必要かもしれません)。

0

すべてのデータが入力されることはありません。 NSTableViewはデータを保存せず、データソース(またはバインディングを使用している場合はバインドされたオブジェクト)から動的に要求します。それは、データソースから取得したデータを使って描画し、それを捨てるだけです。たとえば、表に表示されていないデータを要求する表はありません。

データソースを使用しているようですね。データが変更されたときは、テーブル上で-reloadDataを呼び出すことはあなたの責任です。これはちょっとした誤解です。それはもっと「すべてを無効にする」のようなものです。

つまり、データがいつ変更されるのかはすでにわかっているはずです。これは、どの列を非表示にするかを計算できるポイントです。

3

これはバインディングで行いましたが、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]; 

この擬似スニペットはあなたにそれの要点を与える必要があります。

0

@amrox - あなたの提案を正しく理解していれば、テーブルのNSTableColumnsの隠れたプロパティに値をバインドする必要がありますか?それはうまくいくようですが、NSTableColumnには非表示のプロパティがあるとは思われません。なぜなら、isHiddenおよびsetHiddenメッセージは列の可視性を制御しているからです。 (これはかなり可能です)。

10

Mac OS X v10.5以降では、NSTableColumnにはsetHidden: selectorがあります。

これは、列を動的識別子を使用して示す/非表示にすることができるようになります

NSInteger colIdx; 
NSTableColumn* col; 

colIdx = [myTable columnWithIdentifier:@"columnIdent"]; 
col = [myTable.tableColumns objectAtIndex:colIdx]; 
[col setHidden:YES]; 
1

これは、Interface Builderでは動作しません。しかし、それはプログラム的に動作します。ここで私は私のNSUserDefaultsでキーに識別子 "ステータス" でNSTableViewColumnをバインドする方法を示します。

スウィフト:

tableView.tableColumnWithIdentifier("Status")?.bind("hidden", toObject: NSUserDefaults.standardUserDefaults(), withKeyPath: "TableColumnStatus", options: nil) 

のObjective-C: Aになり

[[self.tableView tableColumnWithIdentifier:@"Status"] bind:@"hidden" toObject:[NSUserDefaults standardUserDefaults] withKeyPath:@"TableColumnStatus" options:nil]; 
関連する問題