nstableviewで1つのnscellを選択する方法は?
-
03-10-2019 - |
質問
私は小さなものを持っています NSTableView
チェックボックス付き。チェックボックスがチェックされないときはいつでも、隣接するものが必要です NSCell
sは灰色になり、アクセスできない。
ただし、特定のセルのみに対処する方法を理解することはできません。 -dataCellForRow
の NSTableColumn
テーブル列全体のテンプレートセルを常に変更します。
1つのセルにアクセスするにはどうすればよいですか?
編集: を使用してテーブルビューを記入します NSTableViewDataSource
プロトコル。
解決
「セルにアクセスする」ことはありません。 NSTableView
必要な場合にのみデータを要求します。あなたはそれを入力したり、直接制御したりしません。
代わりに、あなたは NSTableViewDatasource
そしてオプション NSTableViewDelegate
プロトコル。テーブルビューは次に、データソースメッセージをコントローラーに送信し、コントローラーが適切なデータを提供します。
テーブルビューに表示されるオブジェクトの編集を、 ‑tableView:setObjectValue:forTableColumn:row:
DataSourceメソッド。この方法は、ユーザーがチェックボックスをクリックすると、コントローラーオブジェクトに呼び出されます。モデルを適切に更新するのは、コントローラーの責任です。
モデルが更新されると、コントローラーがテーブルビューを指示してリロードする必要があります。テーブルビューは、次のように表示する必要があるセルの値をコントローラーに尋ねます ‑tableView:objectValueForTableColumn:row:
DataSourceメソッド。これには、無効にする必要があるセルが含まれます。コントローラーは、セルに適切な値を提供する必要があります。
セルをさらに制御する必要がある場合は、‑tableView:willDisplayCell:forTableColumn:row:
委任方法。これは、セルが表示される直前に呼ばれ、セルを適切に変更できます。
データソースの使用に関する詳細情報はあります ドキュメント.
他のオプション(DataSourceを使用する代わりに)は、ココアバインディングと NSArrayController
モデルオブジェクトのコレクションにバインドすること。その場合、あなたはバインドできます Enabled
テーブル列を、セルの有効な状態を制御するモデルオブジェクトの一部のプロパティに結合します。その財産の状態が正しいことを保証するのはあなたの責任です。
プロパティを別のプロパティの値に依存する必要がある場合は、で概説されている依存するキーメカニズムを使用できます。 キー価値観察 ドキュメンテーション。
他のヒント
その列の編集可能性を、チェックボックスに表示されている値にバインドできますか? IEがチェックされている場合、編集可能です。そうでなければそうではありませんか?
私は正確な編集者インターフェイスを覚えていますが、自宅のMacの隣にいないので、完全に散歩することはできません。これがあなたを正しい方向に向けることを願っています。
SDKバージョン10.7以来、あります -viewAtColumn:row:makeIfNecessary:
の上 NSTableView
. 。私がWebで見つけた情報の大部分は、新しい方法を考慮していないので、ここでは、この質問に対する答えを探している他のすべての人のためです。
マウスイベントからセルの選択まで
まず、コントローラーのプロトコルを追加して、このようなテーブルビューからセルの選択を処理します。
@protocol XYZCellSelectionDelegate <NSObject>
- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column;
@end
その後、サブクラス NSTableView
そしてオーバーライド -mouseDown:
// In your Custom Table View subclass:
- (void)mouseDown:(NSEvent *)event
{
NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
NSInteger selectedRowIndex = [self rowAtPoint:point];
NSInteger selectedColumnIndex = [self columnAtPoint:point];
if ([self.calendarViewDelegate respondsToSelector:@selector(cellViewWasSelectedAtRow:column:)])
{
[self.calendarViewDelegate cellViewWasSelectedAtRow:selectedRowIndex column:selectedColumnIndex];
}
[super mouseDown:event];
}
その後、使用できます -viewAtColumn:row:makeIfNecessary:
このように、デリゲート/コントローラーオブジェクト:
- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column
{
NSView *selectedView = [self.tableView viewAtColumn:column row:row makeIfNecessary:YES];
// Do something with the cell to the right
NSInteger nextColumn = column + 1;
NSView *cellNextToIt = [self.calendarTableView viewAtColumn:nextColumn row:row makeIfNecessary:YES];
}
ノート: 最近では、テーブルビューをパラメーターとして渡して、デリゲートに頼ってテーブルビューへの参照を保持するのではなく、パラメーターとして渡します。