ユーザーが NSTableView のセルの編集をいつ終了したかを知る必要があります。このテーブルには、(CalCalendarStore から取得した) ユーザーのすべてのカレンダーが含まれているため、ユーザーの変更を保存するには、CalCalendarStore に変更を通知する必要があります。ただし、ユーザーが編集を終了した後に呼び出されるものは何も見つかりません。テーブルのデリゲートにメソッドがあると思いますが、編集が終了したときではなく、編集が開始されたときに呼び出されるメソッドしか見ませんでした。
6 に答える
NSTableView
メソッドを使用するNSNotificationCenter
か使用することで、サブクラス化せずに同じ結果を得ることができNSControl
ます。次の Apple ドキュメントを参照してください。
http://developer.apple.com/library/mac/#qa/qa1551/_index.html
ほんの数行のコードで、私にとっては完璧に機能しました。
あなたがの場合はdelegate
、NSTableView
メソッドを実装するだけです
- (void)controlTextDidEndEditing:(NSNotification *)obj { ... }
実際にNSTableView
は、含まdelegate
れるNSControl
要素の であり、それらのメソッド呼び出しをその要素に転送しますdelegate
(便利なメソッドは他にもあります)。
それ以外の場合は、次を使用しNSNotificationCenter
ます。
// where you instantiate the table view
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(editingDidEnd:)
name:NSControlTextDidEndEditingNotification object:nil];
// somewhere else in the .m file
- (void)editingDidEnd:(NSNotification *)notification { ... }
// remove the observer in the dealloc
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSControlTextDidEndEditingNotification object:nil];
[super dealloc]
}
addObserver:toObjectsAtIndexes:forKeyPath:options:context: を使用して、コンテンツ配列内の各アイテムのオブザーバーを設定します。
配列に追加または削除されたオブジェクトについて通知されるように、配列自体のオブザーバーも設定する必要があります。
例として、iSpendプロジェクトを見てください。
NSTableView をサブクラス化し、textDidEndEditing をオーバーライドします (必ずスーパーの実装を呼び出してください)。
これは、テキスト フィールド NSTextFieldCell または NSComboBoxCell によってのみ呼び出されます (ただし、コンボのメニューから値を選択するのではなく、値を入力して変更する場合のみ)。
NSTableDataSourceプロトコルを調べます。探しているメッセージは次のように呼び出されます:tableView:setObjectValue:forTableColumn:row:
NSArrayController をサブクラス化し、objectDidEndEditing をオーバーライドします (必ずスーパーの実装を呼び出してください)。
これはほとんどの場合、テキスト フィールド NSTextFieldCell または NSComboBoxCell によってのみ呼び出されます (ただし、コンボのメニューから値を選択するのではなく、値を入力して変更する場合のみ)。それを呼び出す他のセルがいくつかあるかもしれませんが、どのセルかはわかりません。カスタム セルがある場合は、NSEditor および NSEditorRegistration 非公式プロトコルの実装を検討してください。