2

我有一个必须是唯一的文本字段,所以我添加了我的自定义NSFormatter(见下文)

正如您在屏幕截图中看到的那样,格式化程序可以工作,但是我正在使用的连续绑定已损坏,因此例如绑定的文本不再实时更新。

我在这里找到了可能的原因,但我不知道如何解决这个问题并重新启用连续绑定:

...

  • 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;
}

工作验证

在此处输入图像描述

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

4

1 回答 1

4

周末我遇到了同样的问题,最终在可可开发邮件列表上发现了Yann Disser 2008 年的一篇帖子,它揭示了我的问题。

我有一个NSFormatter运行良好的现有组件,当我分解组件时,所以今天早上我花了更多时间在它上面并找到了 Yann 的帖子。

关键是您需要返回与传入的对象不同的对象。这很微妙,但文档说:如果转换成功,则返回时包含从 string 创建的对象。

我遇到的问题源于这样一个事实,NSString即进来的那个实际上是一个NSMutableString并且稍后会被修改。

这是修改为 return 的代码[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;
    }
}
于 2014-04-21T11:38:23.187 回答