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

10-10 05:34