3

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

我试图(在 Xcode 4.3 的界面生成器中)将最大值绑定到数组计数,如下所示:

最大值(共享用户默认值 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];

然后:

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

但我本来希望不用额外的步骤来做到这一点

4

1 回答 1

5

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

第一个选项

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

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

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

绑定:用户默认控制器

控制器键:值

模型密钥路径:<#your Key#>

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

绑定:ArrayFromDefaultsController

控制器键:排列对象

模型键路径:@count

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

第二种选择

创建一个 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)

值转换器:ArrayCountValueTransformer

于 2013-03-15T16:35:36.907 回答