NSTextFieldCellの編集した値に基づいて更新バインド辞書
-
11-09-2019 - |
質問
私はコアデータを使用してNSCoding / plistのベースのアーカイブからいくつかの古代のコード(10.2時代に)移植に取り組んでいます。私は、カスタムNSTextFieldCellとNSOutlineViewを持っています。アウトライン・ビューは、データを提供するために、NSTreeControllerにバインドされます。
バインディングモデルは次のようになります:
NSTreeController: 管理オブジェクトコンテキスト - > Controller.managedObjectContext
NSOutlineViewのNSTableColumn バリュー - >ツリーコントローラー:arrangedObjects:itemDictionary
NSOutlineViewは、テキストフィールドの隣に画像を追加したカスタムNSTextFieldCellサブクラスを持っているので、私は私が引くとタイトルを設定し、キーの値をにisCheckedすることができますので、NSMutableDictionaryはitemDictionaryと呼ばれるとして、それにNSManagedObjectの値を渡しています。
私が問題に実行していますどこに戻って私の管理オブジェクトインスタンスに値を変更し、テキストフィールドの値と通過を更新しています。ユーザーtitleの値をダブルクリックして、それを編集した後、-(id)objectValue
に渡されるが、私は次のステップは更新が私のNSManagedObjectのインスタンスに伝播得ることですかわからないんだけどさ。私は私のNSTextFieldCellサブクラス内の値を読み取り、設定するため、これまで持っていたコードは以下の通りです:
- (void)setStringValue:(NSString *)aString {
[super setObjectValue:aString];
}
- (void)setObjectValue:(id <NSCopying>)anObject {
id cellValues = anObject;
[super setObjectValue:[cellValues valueForKey:@"title"]];
[self setCheckState:[[cellValues valueForKey:@"isChecked"] integerValue]];
}
- (id)objectValue {
return [super objectValue];
}
解決
私は周りに聞くと、これは、誰かが私に与えた勧告です。それは合理的に見えます。
あなたのNSCellのサブクラスでは、メソッドは新しい値を設定するとイベントループによって呼び出されているものには、このような何かます:
- (void)whateverMethodInCellSubclassIsTriggeredByEventLoop:(id)value {
NSTableView *tableView = [self controlView];
NSTableColumn *column = [[tableView tableColumns] objectAtIndex:[tableView editedColumn]];
NSInteger rowIndex = [tableView editedRow];
NSDictionary *bindingInfo = [column infoForBinding:NSValueBinding];
id modelObject = nil;
if ([controlView isKindOfClass:[NSOutlineView class]]) {
NSTreeNode *item = [outlineView itemAtRow:rowIndex];
modelObject = [item representedObject];
} else if ([controlView isKindOfClass:[NSTableView class]]) {
NSArrayController *controller = [bindingInfo objectForKey:NSObservedObjectKey];
modelObject = [[controller arrangedObjects] objectAtIndex:rowIndex];
}
[modelObject setValue:value forKeyPath:[bindingInfo objectForKey:NSObservedKeyPathKey]];
}
これは、あなたの変更がプッシュされるべきであり、変更をプッシュするために、一般的なKVCを使用するにモデルオブジェクトとキーのパスを取得するには、テーブルの列に利用可能な結合の情報を活用して、かなり一般的なコードです。これは、両方のテーブルのために働くと任意のモデルオブジェクト、コアデータかどうかのためだけでなく、ビューの概要を説明する必要があります。
他のヒント
私はおそらくoutlineView:willDisplayCell:forTableColumn:item:
のデリゲートメソッドを実装し、むしろ細胞サブクラスの中からよりも、そこにセルのにisCheckedプロパティを設定することで、さまざまな方法でこれに近づくでしょう。その後、ちょうどarrangedObjects.titleに直接その列を結合するので、デフォルトの編集メカニズムは、管理オブジェクトインスタンスにプロパティを設定するの世話をするでしょう。
IIRC、あなたが渡されるitem
パラメータは、実際にそのrepresentedObject財産あなたは、あなたがそれから、その方法が必要になりますどんな情報を得ることができますので、あなたにその行のNSManagedObjectのインスタンスを与えるNSTreeNodeインスタンスになります。