NSMutableDictionary с UIButton* как ключи - разработка iPhone

Я плохо знаком с разработкой iPhone, и у меня есть вопрос, который может иметь очень простой ответ. Я пытаюсь добавить кнопки к представлению, и эти кнопки связаны с пользовательским классом, который я определил. Когда я добавляю кнопки к представлению, я хотел бы знать, какому классу эти кнопки соответствуют. Это вызвано тем, что, когда я нажимаю кнопку, я должен получить некоторую информацию о классе, но получатель сообщения является другим классом. Я не мог найти информацию об ошибке, что я вхожу в сеть. Проблема, которую я имею, состоит в том, что я пытаюсь создать NSMutableDictionary, где ключи имеют тип, UIButton* и значения имеют мой пользовательский тип:

   // create button for unit
   UIButton* unitButton = [[UIButton alloc] init];
   [sourceButtonMap setObject:composite forKey:unitButton];

Конечно, sourceButtonMap определяется в классе и инициализируется в функции init как sourceButtonMap = [[NSMutableDictionary alloc] init];

Ошибка, которую я получаю, когда я пытаюсь добавить пару "ключ-значение":

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIButton copyWithZone:]: unrecognized selector sent to instance 0x3931e90'

Это происходит, потому что я не могу сохранить UIButton* как ключи? Кто-либо может указать на меня, почему я получаю эту ошибку? Спасибо всем,

aa

10
задан kennytm 12 May 2010 в 15:39
поделиться

2 ответа

Из Apple docs:

Ключ копируется (используя copyWithZone:; ключи должны соответствовать протоколу NSCopying).

UIButton не соответствует протоколу NSCopying, поэтому его нельзя использовать в качестве ключа в NSDictionary

.
3
ответ дан 3 December 2019 в 17:19
поделиться

Я нашел один из способов - использовать конструкцию NSValue в качестве ключа. Для создания этого используйте:

[NSValue valueWithNonrehibitedObject: myButton] .

Кажется, здесь есть предостережение: если кнопка будет обработана сборщиком мусора, ключ будет содержать недопустимую ссылку.

Вы можете снова получить ссылку на UIButton, просматривая словарь следующим образом:

for (NSValue* nsv in myDict) {
    UIButton* b = (UIButton*)[nsv nonretainedObjectValue];
    ...
}
16
ответ дан 3 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: