我有一个必须是唯一的文本字段,因此我添加了自定义NSFormatter
(请参见下文)
如屏幕截图所示,格式化程序可以正常工作,但是我正在使用的连续绑定已中断,因此例如绑定文本不再实时更新。
我找到了可能的原因here,但是我不知道如何解决此问题并重新启用连续绑定:
...
12.如果视图附加了NSFormatter,则值为
由NSFormatter实例格式化。继续执行步骤17。
...
17.更新的值显示在用户界面中。
因此,它似乎有意跳过了我们想要的步骤。这个
非常烦人我尝试了NSValueTransformer,但将其添加到了
可编辑的NSTextField使其不可编辑。
我的格式化程序
- (BOOL)getObjectValue:(out id *)obj forString:(NSString *)string errorDescription:(out NSString **)error {
if([string isNotEqualTo:@"todo-invalid-value"]){
*obj = string;
NSLog(@"YES");
return YES;
} else {
if(error){
*error = @"ERROR: not allowed";
}
return NO;
}
}
- (NSString *)stringForObjectValue:(id)obj {
return (NSString *)obj;
}
工作验证
请注意,列表项的标题应使用我在文本字段中输入的文本进行更新。
最佳答案
我在周末遇到了同样的问题,最终在cocoa-dev邮件列表中发现了一个post from 2008 by Yann Disser,这使我的问题更加清晰。
我有一个可以正常工作的现有NSFormatter
,当我分解组件时,所以今天早上我花了更多时间在此上,并找到了Yann的职位。
关键是您需要返回一个与传入对象不同的对象。这很微妙,但是文档说:如果转换成功,则返回时包含从字符串创建的对象。
我遇到的问题源于以下事实:即将传入的NSString
实际上是NSMutableString
,并且稍后会进行修改。
这是修改为返回[NSString stringWithString: string]
的代码,它可以解决您的问题:
- (BOOL)getObjectValue:(out id *)obj forString:(NSString *)string errorDescription:(out NSString **)error {
if([string isNotEqualTo:@"todo-invalid-value"]){
*obj = [NSString stringWithString: string];
NSLog(@"YES");
return YES;
} else {
if(error){
*error = @"ERROR: not allowed";
}
return NO;
}
}
关于macos - 带有NSFormatter的NSTextField导致断开的连续绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19377563/