【问题标题】:Binding to @count of an array in the user defaults绑定到用户默认值中数组的@count
【发布时间】:2012-06-22 12:00:42
【问题描述】:

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

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

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

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

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

NSUInteger maxVal
...

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

然后:

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

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

【问题讨论】:

  • 在程序化版本中,您省略了键路径中的“值”。也许这是部分原因?
  • 我之前试过删除它,但这是必要的。但是您的评论让我意识到在 XIB 中我绑定到共享用户默认值 controller 但在代码中它是标准用户默认值对象。
  • 值的文档说“返回一个用于访问用户默认属性的键值编码兼容对象”,以及“此属性可使用键观察-value 观察”,所以我认为它会起作用。显然我还缺少其他东西。
  • 好吧,我只是想知道为什么您的程序示例在您遗漏了“值”的情况下仍然有效

标签: xcode cocoa cocoa-bindings


【解决方案1】:

您可以在 Interface Builder 中使用 standardUserDefaults,有 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]];
    } 
}

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

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

绑定:用户默认控制器

控制器键:值

模型密钥路径:(无@count)

值转换器:ArrayCountValueTransformer

【讨论】:

  • 我真的不记得问过这个问题或我之后做了什么,但这些似乎很好的答案,所以我会将其标记为已接受的答案。
猜你喜欢
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2015-04-16
  • 1970-01-01
相关资源
最近更新 更多