2011-10-27 5 views
1

ビューベースのテーブルビューを使用する状況があり、データソースとテーブルビューの間でバインディングを使用したくない場合があります。これは主に私のNSTableCellViewが複数のサブビュー、複雑なバリデーション、および他のオブジェクトのメソッドへのトリガされた呼び出しを持つことができるためです。対象のNSTableViewベースのアクションデータソースの更新

我々が持つデータソースとNSTableViewを更新する非常に明確なパスがあります。しかし、後方のために、それはNSTableViewにアップデートしてデータソースを更新している私たちは、セルベースのテーブルビューのための私たちが持っている一種の何もない

tableView:viewForTableColumn:row: 

を:

tableView:setObjectValue:forTableColumn:row: 

ターゲットアクションパターンが代わりに使用されます。だから、私は基本的に2つの質問している:私は1つの特定のビュー、またはそのサブビューのためのターゲットとアクションを設定した場合

  1. 、どのように私は、データソースに更新するかを知るために、適切な行と列の情報を得るのですか?

クリックしてNSTableViewから列をクリックすると、1つのサブビューオブジェクトを編集または変更したにもかかわらず、トリックを行う必要がありますか?動作パラメータとして、例えばNSTextFieldために通過する場合、私は、行および列について(他のオブジェクトではなく、NSTableViewインスタンスとして)対象に通知することができる方法

(これら2つのプロパティが最初の質問に対する適切な答えであれば)私は基本的にサブビューツリーをclickedColumnとclickedRowに来ることができますが、私は、このようにかなり多くの非エレガントな解決策を見つけると勘より良い方法があるがあります。事前に...

感謝....

答えて

2

NSTableCellViewobjectValueを持っています。すでに設定しているので、アクションでは[(NSTableCellView *)[sender superview] objectValue]を使用して、どのオブジェクトを操作する必要があるかを調べることができます。

サブクラスNSTableCellViewもお勧めします。モデルの他の部分にアクセスする必要がある場合は、View Controllerのコンセントを追加できます。

実際に行番号が必要な場合は、コンテンツアレイでindexOfObjectと電話することができます。

+0

はい、私はNSTableCellViewをサブクラス化する意図があります。私のアクションメソッドは他のいくつかのクラスにある可能性が高いです。だから、[[[(NSTableCellView *)[sender superview] objectValue] superview] clickedRow]のようなものは、クリックされた行の行位置を与えることができますか? – mbpro

+0

それはうまくいくはずです。それをよりきれいにするには、行番号と列番号のカスタムセルプロパティを与え、 'tableView:viewForTableColumn:row:'に値を設定します。 – paulmelnikow

+0

これはすばらしいアイデアです!ありがとう@ NOA! – mbpro

1

2つのNSTableViewメソッドrowForViewとcolumnForViewがこのトリックを行う必要があります。 TableViewのNSButtonによって起動されたようなターゲット/アクションメソッドの送信者で呼び出すことができます(OK、サブウィンドウのどこかに持っています) または、これらのメソッドを次のようなデリゲートメソッドの実装内から呼び出すことができますNSTextDelegateからのtextDidChangeしたがって、対応する配列を簡単に更新できます。 継続的な更新を望まない場合は、textDidEndEditingもジョブを実行します。

- (void)textDidChange:(NSNotification *)notification 
{ 
    NSTextView *tv = [notification object]; 
    int r = [tableView rowForView:tv]; 
    int c = [tableView columnForView:tv]; 
    NSLog(@"Row: %d Column: %d", r, c); 
    // updating code here 
} 
関連する問題