【问题标题】:Add NSArray to CLBeaconRegion via setValue forKey causes Error通过 setValue forKey 将 NSArray 添加到 CLBeaconRegion 会导致错误
【发布时间】:2013-10-21 19:01:39
【问题描述】:

是否可以通过setValue forKey 将数组添加到CLBeaconRegion

我已尝试添加:

[regionAdvert setValue:haveArray forKey:@"advertArray"];

但我只收到以下错误:

> Terminating app due to uncaught exception 'NSUnknownKeyException',
> reason: '[<CLBeaconRegion 0x15379600> setValue:forUndefinedKey:]: this
> class is not key value coding-compliant for the key advertArray.'

【问题讨论】:

  • 您想将任意对象与该区域相关联?
  • 那么,这不可能吗?我很困惑,因为 xcode 向我建议了它。 :S
  • 为什么不使用majorminor属性来识别区域?
  • @Wain 识别不是问题。我想向该区域添加数据。例如,只打开一个警报视图,如果该区域有一个包含对象 abc 的数组。

标签: objective-c exception nsarray ibeacon


【解决方案1】:

setValue:forKey: 是一个KVC 方法,基本上每个类都可以使用——但这并不意味着你可以传递任何东西给它。您使用的密钥必须是现有属性(嗯,实际上是一种方法,因为它是被调用的方法,或者是已处理的不存在的密钥)。无论如何,关键是您应该在尝试设置之前知道密钥存在。

从技术上讲,您可以使用objc_setAssociatedObject 将任意对象与其他对象相关联,但在这种情况下,我鼓励您改为使用majorminor 属性来检查该区域的用途,然后再决定如何显示您的警告。

【讨论】:

  • 感谢您的回答。如何“设置”密钥?我只知道我这样做的方式。
  • 如果你有 @property (strong) NSString *myString; ,那么会将 myString 键添加到你的类(和一些访问器方法)。当您调用 setValue:forKey: 时,它会被转换为 setMyString:(这是该属性为您创建的访问器方法之一)。
  • 它仍然会导致错误。顺便说一句:如何编辑主要值?
【解决方案2】:

不,你不能这样做。如果您想将其他数据与 CLBeaconRegion 相关联,那么您可以使用其他数据结构,例如 NSDictionary。由于每个 CLBeaconRegion 都是用唯一的“标识符”字符串构造的,因此您可以将此标识符用作 NSDictionary 的键来存储您的其他任意数据对象。

此外,CLBeaconRegion 一旦构建完成,就不应更改。字段是不可变的。这没什么大不了的——只有三个字段。只需创建一个新的 CLBeaconRegion,复制您希望保留的旧 CLBeaconRegion 中的任何标识符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 2018-11-02
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多