使用NSFormatter的NSTextField会导致连续绑定中断

时间:2013-10-15 09:22:41

标签: macos cocoa validation binding nsformatter

我有一个必须唯一的文字字段,因此我添加了自定义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;
}

工作验证

enter image description here

请注意,列表项的标题应使用我在文本字段中输入的文本进行更新。

1 个答案:

答案 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;
    }
}