Objective c 绑定返回默认值(使用registerDefaults:设置),而不是零
这是我的设置:Objective c 绑定返回默认值(使用registerDefaults:设置),而不是零,objective-c,cocoa,binding,cocoa-bindings,null,Objective C,Cocoa,Binding,Cocoa Bindings,Null,这是我的设置: myTextField绑定到共享用户默认控制器中的一个键。用户只能在文本字段中输入数字 每次加载应用程序时,我都会使用[[NSUserDefaults standardUserDefaults]registerDefaults:…]加载默认首选项(从应用程序的资源文件夹) myMenuItem的标题绑定到共享用户默认控制器中的同一个键 问题: 当myTextField为空时,myMenuItem接收使用registerDefaults:加载的默认值,而不是表示空字段的某个值(
绑定到共享用户默认控制器中的一个键。用户只能在文本字段中输入数字myTextField
- 每次加载应用程序时,我都会使用
加载默认首选项(从应用程序的资源文件夹)[[NSUserDefaults standardUserDefaults]registerDefaults:…]
的标题绑定到共享用户默认控制器中的同一个键myMenuItem
myTextField
为空时,myMenuItem
接收使用registerDefaults:
加载的默认值,而不是表示空字段的某个值(我希望为0或nil
)
例如,当NSTextField
为空时,菜单项接收“2”,即使用registerDefaults:
加载的值,而不是表示该字段为空的某个值
- (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];
}
}
如果我对registerDefaults:
code进行注释,则绑定将返回nil
,这与NSTextField中没有任何内容时所期望的一样
我试图搞乱许多绑定的设置,并尝试占位符值,我查看了Cocoa绑定和用户默认文档,但找不到解决方案
预期行为:
- 当文本字段为空时,我希望
myMenuItem
反映这一点,而不是使用使用registerDefaults:
注册的默认值
任何帮助都将不胜感激。我从irc.freenode.org#macdev的好人那里得到了一些提示,发现以下是解决我问题的方法:
创建NSFormatter(在我的例子中是NSNumberFormatter)的子类并重写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子类的反向转换方法也适用于此。注意:
上述解决方案不适用于字符串。也就是说,如果您的userDefault值是一个字符串,并且您已将其绑定到NSTextField的值,并且您将NSFormatter子类化并执行以下操作:
- (BOOL)getObjectValue:(id *)anObject forString:(NSString *)string errorDescription:(NSString **)error {
if ([string isEqualToString:@""]) {
*anObject = nil;
}
return YES;
}
您会发现,当NSTextField为空时,绑定将设置为最初使用-registerDefaults:注册的任何值,而不是空字符串或nil值。我试图使用*anObject=[NSNull];同样,但这也不起作用——绑定仍然设置为原始的默认值
我最终设置了*anObject=@';(一个带单个空格的字符串),因此当textField为空时,userDefaults pList中的值设置为字符串:@“。然后,我在任何地方检查使用该userDefault值的字符串,并做出适当的响应(忽略单个空格,并将其视为userDefault值为空)
这是一个丑陋的黑客行为,但目前我能找到的唯一解决这个问题的方法。我把它贴在这里,以防有人无意中发现这个帖子。如果您问我,将NSTextField绑定到userDefault应该可以在textField为空时将userDefault设置为空字符串!我无法理解苹果为什么选择他们那样做