0

私は、NSCoding/plist ベースのアーカイブから Core Data の使用への古いコード (10.2 時代) の移植に取り組んでいます。カスタム NSTextFieldCell を持つ NSOutlineView があります。アウトライン ビューは、データを提供するために NSTreeController にバインドされます。

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

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

NSOutlineView の NSTableColumn 値 -> Tree Controller:arrangedObjects:itemDictionary

NSOutlineView には、テキスト フィールドの横に画像を追加するカスタム NSTextFieldCell サブクラスがあるため、NSManagedObject の値を itemDictionary と呼ばれる NSMutableDictionary として渡し、タイトルと 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];
}
4

2 に答える 2

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 を使用して変更をプッシュする、かなり一般的なコードです。テーブル ビューとアウトライン ビューの両方、および任意のモデル オブジェクト (コア データかどうかに関係なく) で機能するはずです。

于 2009-06-08T05:54:58.970 に答える
0

outlineView:willDisplayCell:forTableColumn:item:おそらく、デリゲートメソッドを実装し、セルのサブクラス内からではなく、そこにセルのisCheckedプロパティを設定するという、別の方法でこれにアプローチします。次に、その列をarrangedObjects.titleに直接バインドするだけなので、デフォルトの編集メカニズムが管理対象オブジェクトインスタンスのプロパティの設定を処理します。

IIRC、item渡されるパラメーターは実際にはNSTreeNodeインスタンスであり、そのpresentedObjectプロパティはその行のNSManagedObjectインスタンスを提供するため、必要な情報をその方法で取得できます。

于 2009-06-05T17:51:21.447 に答える