Я плохо знаком с разработкой 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
Из Apple docs:
Ключ копируется (используя copyWithZone:; ключи должны соответствовать протоколу NSCopying).
UIButton не соответствует протоколу NSCopying, поэтому его нельзя использовать в качестве ключа в NSDictionary
.Я нашел один из способов - использовать конструкцию NSValue в качестве ключа. Для создания этого используйте:
[NSValue valueWithNonrehibitedObject: myButton]
.
Кажется, здесь есть предостережение: если кнопка будет обработана сборщиком мусора, ключ будет содержать недопустимую ссылку.
Вы можете снова получить ссылку на UIButton, просматривая словарь следующим образом:
for (NSValue* nsv in myDict) {
UIButton* b = (UIButton*)[nsv nonretainedObjectValue];
...
}