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

时间:2012-06-20 10:56:22

标签: xcode cocoa cocoa-bindings

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

我正在尝试(在Xcode 4.3的界面构建器中)将Max Value绑定到这样的数组计数:

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

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

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

NSUInteger maxVal
...

NSUserDefaults* stdUD=[NSUserDefaults standardUserDefaults];
[self bind:@"maxVal" toObject:stdUD withKeyPath:@"MYArrayName.@count" options:nil];

然后:

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

但我希望在没有额外步骤的情况下做到这一点

1 个答案:

答案 0 :(得分:4)

您可以将standardUserDefaults与Interface Builder一起使用,有2个选项:

第一个选项

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

然后,在NSArrayController中拖动,并将其命名为“ArrayFromDefaultsController”(仅为了清楚起见)。确保它的模式是Class,Class Name是NSArray(或NSMutableArray)。

在“绑定”选项卡中的“内容数组:

”下

绑定:用户默认控制器

控制器密钥:值

模型关键路径:< #your Key#>

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

绑定:ArrayFromDefaultsController

控制器密钥:arrangeObjects

模型关键路径:@count

这只是创建一个在用户默认值中绑定数组的Array Controller,并且该字段绑定到该Array Controller的arrangeObjects的计数值。

第二选项

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

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

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

这会自动将您的用户默认数组的数量转换为模型密钥路径中可识别的值。

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

绑定:用户默认控制器

控制器密钥:值

模型关键路径:< #your key#> (没有@count)

Value Transformer :ArrayCountValueTransformer