Добавление NSArray в CLBeaconRegion через setValue forKey вызывает ошибку

Можно ли добавить массив в CLBeaconRegion через setValue forKey?

Я попытался добавить его:

[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.'

person Christian    schedule 21.10.2013    source источник
comment
Вы хотите связать произвольный объект с регионом?   -  person Wain    schedule 21.10.2013
comment
Значит, так нельзя? Я был сбит с толку, потому что xcode предложил мне это. :С   -  person Christian    schedule 21.10.2013
comment
Почему бы вам не использовать свойства major, minor для определения региона?   -  person Wain    schedule 21.10.2013
comment
@Wain Идентификация не проблема. Я хочу добавить данные в регион. Например, открывайте окно предупреждений только в том случае, если в регионе есть массив с объектом abc.   -  person Christian    schedule 21.10.2013


Ответы (2)


setValue:forKey: – это метод KVC, в основном доступен для каждого класса, но это не значит, что вы можете просто передать ему что угодно. Ключ, который вы используете, должен быть существующим свойством (ну, на самом деле это метод, который вызывается, или обработанный несуществующий ключ). В любом случае, дело в том, что вы должны знать, что ключ существует, прежде чем пытаться его установить.

Технически вы можете использовать objc_setAssociatedObject для связывания произвольных объектов с другими объектами, но в этом случае я бы посоветовал вам вместо этого использовать свойства major и minor, чтобы проверить назначение региона, прежде чем решать, как отображать оповещение.

person Wain    schedule 21.10.2013
comment
Спасибо за ваш ответ. Как установить ключ? Я знаю это только так, как знал. - person Christian; 21.10.2013
comment
Если бы у вас был @property (strong) NSString *myString;, это добавило бы ключ myString в ваш класс (и некоторые методы доступа). Когда вы вызываете setValue:forKey:, он преобразуется в setMyString: (это один из методов доступа, созданных для вас свойством). - person Wain; 21.10.2013
comment
Это все еще вызывает ошибку. Кстати: как я могу изменить основное значение? - person Christian; 21.10.2013
comment
давайте продолжим это обсуждение в чате - person Christian; 21.10.2013

Нет, ты не можешь этого сделать. Если вы хотите связать другие данные с CLBeaconRegion, вы можете использовать другие структуры данных, такие как NSDictionary. Поскольку каждый CLBeaconRegion состоит из уникальной строки «идентификатора», вы можете использовать этот идентификатор в качестве ключа в NSDictionary для хранения других ваших произвольных объектов данных.

Кроме того, вы не должны изменять CLBeaconRegion после создания. Поля неизменяемые. В этом нет ничего страшного — всего три поля. Просто создайте новый CLBeaconRegion, скопировав любой идентификатор из старого CLBeaconRegion, который вы хотите сохранить.

person davidgyoung    schedule 22.10.2013