2009-06-04 42 views
0

我正在将一些古代码(10.2时代)从基于NSCoding/plist归档移植到使用核心数据。我有一个带有自定义NSTextFieldCell的NSOutlineView。大纲视图绑定到NSTreeController以提供数据。更新基于NSTextFieldCell编辑值的绑定字典

的绑定模式是这样的:

NSTreeController: 托管对象上下文 - > Controller.managedObjectContext

NSOutlineView的NSTableColumn 价值 - >树控制器:arrangedObjects:itemDictionary

的NSOutlineView有自定义NSTextFieldCell子类,它在文本字段旁边添加一个图像,所以我将NSManagedObject的值作为一个名为itemDictionary的NSMutableDictionary传递给它,以便我可以拉和设置标题和isChecked关键值va梅毒。

我遇到的问题是更新文本字段的值并将更改后的值传递回我的托管对象实例。用户双击标题值并对其进行编辑后,它会传递到-(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子类中? – 2009-06-05 02:33:04

+0

是的,这是NSTextFieldCell子类的肉。 – 2009-06-05 02:35:41

回答

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财产那里,而不是来自细胞亚类。然后,您只需将该列直接绑定到arrangedObjects.title,因此默认编辑机制将负责设置托管对象实例的属性。

IIRC,item你得到的参数实际上是一个NSTreeNode实例,它的representObject属性会为你提供该行的NSManagedObject实例,所以你可以通过这种方式得到你需要的任何信息。