2010-09-29 48 views
1

这里是我的设置:绑定返回默认值(与registerDefaults设置:)而不是零

  • myTextField势必在共享用户默认控制器的关键。用户只能在文本字段中输入数字。
  • 每当我的应用程序加载时,我使用[[NSUserDefaults standardUserDefaults] registerDefaults: ... ]加载默认首选项(从应用程序的资源文件夹)。
  • myMenuItem的标题绑定到共享用户默认值控制器中的相同密钥。

问题:

myTextField是空的,myMenuItem接收使用registerDefaults:,而不是表示空领域的一些值加载默认值(我所期望的0或nil)。

例如,当NSTextField为空时,菜单项会收到“2”,即使用registerDefaults:加载的值,而不是某个值,表示该字段为空。

如果我对registerDefaults:代码发表评论,那么当我在NSTextField中没有任何内容时,绑定返回nil

我试图解决许多绑定的设置以及实验占位符值,我查看了可可绑定和用户默认文档,但找不到解决方案。

预期的行为:

  • 当文本字段为空,我想myMenuItem,以反映而不是使用使用registerDefaults:注册的默认值。

任何帮助将不胜感激。

回答

2

我从漂亮的人一些提示在irc.freenode.org #macdev,发现下面是解决我的问题:

(在我的情况或NSNumberFormatter)创建NSFormatter的子类和压倒一切getObjectValue:forString:errorDescription:覆盖默认行为返回nil(使绑定使用注册的默认值),而不是在文本字段为空时返回0。

- (BOOL)getObjectValue:(id *)anObject forString:(NSString *)string errorDescription:(NSString **)error { 
    if ([string isEqualToString:@""]) { 
     *anObject = [NSNumber numberWithInt:0]; 
     return YES; 
    } else { 
     return [super getObjectValue:anObject forString:string errorDescription:error]; 
    } 
} 

NSValueTransformer子类的逆向转换方法也适用于此。

1

注意:

上述解决方案不适用于字符串。也就是说,如果你的userDefault值是一个字符串,你已经绑定的是一个的NSTextField的价值,你继承NSFormatter并做到这一点:

- (BOOL)getObjectValue:(id *)anObject forString:(NSString *)string errorDescription:(NSString **)error { 
    if ([string isEqualToString:@""]) { 
     *anObject = nil; 
    } 
    return YES; 
} 

你会发现,当的NSTextField是空的,绑定被设置为您最初使用-registerDefaults注册的任何值:而不是空字符串或零值。我试图使用* anObject = [NSNull null];同样,但这也不起作用---绑定仍然设置为原始默认值。

我结束了设置* anObject = @“”; (具有单个空格的字符串),以便当textField为空时,userDefaults pList中的值设置为字符串:@“”。然后检查使用该userDefault值并正确响应的字符串(忽略单个空间并将其视为userDefault值为空)。

这是一个丑陋的黑客攻击,但目前我可以找到解决此问题的唯一方法。我在这里发布它,以防其他人在这个线程上绊倒。如果你问我,将NSTextField绑定到userDefault应该是血腥的,并且在textField为空时将userDefault设置为空字符串!为什么苹果选择这样做的方式超出了我的想象。