我有一个必须唯一的文字字段,因此我添加了自定义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;
}
请注意,列表项的标题应使用我在文本字段中输入的文本进行更新。
答案 0 :(得分:3)
我在周末遇到了同样的问题,最终在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;
}
}