绑定到用户默认值中的数组的@count

mar*_*ark 3 xcode cocoa cocoa-bindings

是否可以将 Control 绑定到存储在用户默认值中的数组的集合属性?

我试图(在 Xcode 4.3 的界面构建器中)将 Max Value 绑定到数组计数,如下所示:

最大值(共享用户默认值 Controller.values.MYArrayName.@count)
绑定到:共享用户默认值控制器
控制器键:
模型键路径: MYArrayName.@count

不幸的是,这根本没有影响(甚至没有任何错误)。

我可以将 Max Value 绑定到视图控制器中的 ivar,然后将其绑定到用户默认值中的值。例如

NSUInteger maxVal
...

NSUserDefaults* stdUD=[NSUserDefaults standardUserDefaults];
[self bind:@"maxVal" toObject:stdUD withKeyPath:@"MYArrayName.@count" options:nil];
Run Code Online (Sandbox Code Playgroud)

然后:

最大值(文件的所有者.maxVal)
绑定到:文件所有者
控制器密钥:
模型密钥路径: maxVal

但我希望不用额外的步骤就可以做到

mac*_*dyp 5

您可以在 Interface Builder 中使用标准用户默认值,有 2 个选项:

第一个选项

在 Interface Builder 中,将 User Defaults Controller 拖入 Objects。

然后,拖入一个 NSArrayController,并将其命名为“ArrayFromDefaultsController”(只是为了清楚起见)。确保它的模式是类,类名是 NSArray(或 NSMutableArray)。

在绑定选项卡中,在内容数组下:

绑定:用户默认控制器

控制器键:值

模型密钥路径:<#您的密钥#>

转到您的字段,并绑定它的最大值:

绑定:ArrayFromDefaultsController

控制器键:排列对象

模型键路径:@count

这只是创建了一个数组控制器,该控制器绑定了用户默认值中的数组,并且该字段绑定到该数组控制器的排列对象的计数值。

第二种选择

创建一个 NSValueTransformer 子类(例如 ArrayCountValueTransformer),并在类中放置:

+(Class)transformedValueClass {
    return [NSNumber class];
}

- (id)transformedValue:(id)value {
    if (value == nil) {
        return nil;
    } else {
        return [NSNumber numberWithInteger:[value count]];
    } 
}
Run Code Online (Sandbox Code Playgroud)

这将自动将用户默认数组的计数转换为模型键路径中可识别的值。

将用户默认控制器拖入对象列表。然后,在您要绑定的字段中(在最大值上):

绑定:用户默认控制器

控制器键:值

模型密钥路径:<#your key#>(无@count)

值转换器:ArrayCountValueTransformer