我有一个具有客户ID属性的Core Data模型类。它与形式单元格绑定在一起。当用户完成对文本的编辑时,我希望有机会将其条目转换为大写,使用依赖于旧值和新值的逻辑。
理想情况下,我希望将行为保持在它所属的视图附近,使用可以在nib中实例化的对象并连接到文本单元格。但是我会选择一个与模型挂钩的对象。
我已经实现了以下三种不同的方式:
NSControlTextEditingDelegate
所有三个实现都有问题。问题分别为:
controlTextDidBeginEditing:
调用(并且在调用controlTextDidEndEditing:
时旧值已消失)。此外,在不输入任何内容的情况下进出字段的标签会触发对controlTextDidEndEditing:
的调用。你会如何解决这个问题?
答案 0 :(得分:0)
在some discussion here之后,听起来像是一些可行的方法:
我试过了两个。更多问题:
editWithFrame:inView:editor:delegate:event:
,因此很难在endEditing:
中访问旧值。新解决方案是对我原来的#2:文本编辑委托实施NSControlTextEditingDelegate
的改进。
而不是controlTextDidBeginEditing:
和controlTextDidEndEditing:
,只执行control:textShouldEndEditing:
。在该方法中,如有必要,操纵文本,然后返回YES。
我在nib中实例化它并使其成为表单的委托(而不是单元格)。在下面的代码中,我使用infoForBinding:
获取旧值,但如果您不使用绑定,则可以向模型对象添加插座。
-(BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor {
NSCell *cell = [(NSForm *)control selectedCell];
NSString *identifier = [(NSCell *)[(NSForm *)control selectedCell] identifier];
if (!identifier) return YES;
NSDictionary *bindingInfo = [cell infoForBinding:@"value"];
if (!bindingInfo) return YES;
NSString *oldValue = [[bindingInfo valueForKey:NSObservedObjectKey] valueForKeyPath:[bindingInfo valueForKey:NSObservedKeyPathKey]];
NSString *newValue = cell.stringValue;
if ([identifier isEqualTo:@"firstField"]) {
if (criteria)
cell.stringValue = ....;
} else if ([identifier isEqualTo:@"secondField"]) {
if (criteria)
cell.stringValue = ....;
}
return YES;
}