2009-06-04 8 views
0

NSCoding/plistベースのアーカイブからコアデータを使用する古代コード(10.2時代)を移植しています。カスタムNSTextFieldCellを持つNSOutlineViewがあります。アウトラインビューはNSTreeControllerにバインドされ、データを提供します。NSTextFieldCellの編集値に基づいてバインドされた辞書を更新します。

は、バインディングモデルは次のようになります。

NSTreeController: 管理オブジェクトコンテキスト - > Controller.managedObjectContext

NSOutlineViewのNSTableColumn 値 - >ツリーコントローラー:arrangedObjects:itemDictionary

がNSOutlineViewが持っていますテキストフィールドの隣に画像を追加するカスタムNSTextFieldCellサブクラスです。NSMagedDictionaryをitemDictionaryという名前でNSManagedObjectの値を渡しています。タイトルとisCheckedキーをプルダウンして設定することができますルーズ

問題が発生している箇所は、テキストフィールドの値を更新し、その変更した値を管理オブジェクトインスタンスに戻すことです。ユーザがタイトル値をダブルクリックして編集した後、それは-(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]; 
} 
+0

コードはNSTextFieldサブクラスにありますか? –

+0

ええ、これはNSTextFieldCellサブクラスの肉です。 –

答えて

3

私は尋ねましたが、これは誰かが私に与えた勧告です。それは妥当に見えます。新しい値を設定するとイベントループによって呼び出されるどんな方法であなたの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を使用して変更をプッシュします。これは、表とアウトラインの両方のビュー、およびコアデータの任意のモデルオブジェクトに対して機能するはずです。

0

私はおそらくoutlineView:willDisplayCell:forTableColumn:item:デリゲートメソッドを実装し、セルのにisCheckedプロパティを設定することで、さまざまな方法でこれに近づくだろうそこではなく、細胞のサブクラス内からである。そうすれば、その列を直接alignedObjects.titleにバインドすれば、デフォルトの編集メカニズムが管理オブジェクトインスタンスのプロパティを設定することになります。

IIRCの場合、渡されるパラメータは実際にはNSTreeNodeインスタンスになります。そのrepresentObjectプロパティは、その行のNSManagedObjectインスタンスを提供します。そのようにして必要な情報を得ることができます。

+0

outlineView:willDisplayCell:forTableColumn:itemは値を読み込むために機能しますが、テーブルのセルのisChecked値も更新されますか? これまで、NSCellサブクラスで代行メソッドをセットアップして、何かをクリックしてコントローラに実装した後に変更を処理しました。それは私がKVC/KVOを使用してよりクリーンな方法でこれを行うことができる/そうすべきであるようです。たぶん私は間違っています? –

関連する問題