Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 绑定返回默认值(使用registerDefaults:设置),而不是零_Objective C_Cocoa_Binding_Cocoa Bindings_Null - Fatal编程技术网

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设置为空字符串!我无法理解苹果为什么选择他们那样做