Подтвердить что ты не робот

[UILabel copyWithZone:]: непризнанный селектор, отправленный экземпляру

Мне кажется, что я стучу головой о стену здесь (и я готов это сделать, честно говоря).

Я пытаюсь установить фон для представления. Фон Мне нужно установить изображение, и я использую этот код (который отлично работает в двух других подклассах UIViewController - это была копия/вставка в новый файл):

UIImage *img = [gameNode imageFromKey:@"background"];
UIColor *bg = [[UIColor alloc] initWithPatternImage:img];
self.view.backgroundColor = bg;
[bg release];

Как я уже сказал, это прекрасно работает в двух других местах, однако здесь строка self.view.backgroundColor = bg throws

'NSInvalidArgumentException', reason: '-[UILabel copyWithZone:]: unrecognized selector sent to instance 0x9259840'

Там не так много. Я подтвердил в IB, что для ссылки на просмотр верхнего уровня для владельца файла. Я очистил проект и перезапустил его. Я даже закрыл Xcode и снова перезапустил его - не повезло. Что еще мне не хватает?

Изменить: Как я уже упоминал, трассировки стека не так много, просто это:

2012-05-28 13:13:56.997 OOKL[36012:17303] -[UILabel copyWithZone:]: unrecognized selector sent to instance 0x92b79a0
2012-05-28 13:13:56.997 OOKL[36012:17303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UILabel copyWithZone:]: unrecognized selector sent to instance 0x92b79a0'
*** First throw call stack:
(0x2933052 0x44c7d0a 0x2934ced 0x2899f00 0x2899ce2 0x2935bd9 0xaa92dd 0x6a4f40 0x6a4eeb 0x6bfd60 0xc0191a 0x2934e1a 0x289e821 0xc0046e 0xaa7e2c 0xaa83a9 0xaa85cb 0xb2b59 0xb1969 0x2934ec9 0x9e55c2 0x9e555a 0xa8ab76 0xa8b03f 0xa8a2fe 0xa0aa30 0xa0ac56 0x9f1384 0x9e4aa9 0x2ac6fa9 0x29071c5 0x286c022 0x286a90a 0x2869db4 0x2869ccb 0x2ac5879 0x2ac593e 0x9e2a9b 0x214d 0x20c5)

Ничего другого - до или после.

4b9b3361

Ответ 1

Я предполагаю, что это была одна из тех странных ошибок с Xcode, которую вы не можете отслеживать или воспроизводить каждый раз. Я сузил проблему до одного конкретного UILabel в IB. Как только я подключу его к IBOutlet UILabel *, я получаю эту ошибку.

В ходе дальнейшего расследования выясняется, что имя title вызывало проблему. Я назвал метку

IBOutlet UILabel *title;

Как только я изменил имя на gtitle, все работало так, как ожидалось. Кто знает?..

Ответ 2

Попробуйте следующее:

self.view.backgroundColor = [UIColor clearColor];
self.view.layer.backgroundColor = [[UIColor alloc] initWithPatternImage:img].CGColor;

Ответ 3

Это определенно выглядит как "выпущенная" проблема.

В вашем примере трудно сказать, потому что код выглядит абсолютно нормально, но тот факт, что у вас есть селектор copyWithZone, отправленный на экземпляр UILabel (вместо UIColor), определенно скажите, что bg был выпущен и теперь ссылается на UILabel.

Проверьте, что позже в коде вы еще не выпускаете объект bg.

Надеюсь, что это поможет

ИЗМЕНИТЬ ПОСЛЕ ВАШЕГО ПЕРВОГО КОММЕНТАРИЯ

Это довольно странно, что вы получаете copyWithZone unrecognized selector sent to instance, потому что я считаю, что если ваш self.view был неправильного типа (а не UIView), вы получили бы setBackgroundColor unrecognized selector sent to instance, а не copyWithZone.

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

po [self view]
po [[self view] backgroundColor]

чтобы убедиться, что все работает нормально, как и должно быть.

Ответ 4

эта проблема произошла со мной прошлой ночью, и у меня действительно был ярлык с названием title. Я порвал несколько моих волос, когда менял имя на что-то еще, но не работал. Оказывается, я пытался отправить значение NIL из текстового поля на метку в VC. У меня есть 4 VC, и пользователь вводит заголовок в VC 1 в текстовое поле и получает его в объект типа NSString. Эта строка помещается в метку в VC 4. Когда пользователь не вводит заголовок в VC 1, туда, куда вошел NIL. Я исправил его, назначив значение по умолчанию для строкового объекта, когда пользователь не вводит заголовок в VC1. Надежда помогает кому-то.

Ответ 5

У меня была аналогичная проблема, которую мне удалось решить, используя предоставленные здесь ответы.

В моем случае, однако, у меня был класс UIDateLabel (используемый для представления дат форматированным способом и т.д.). Компиляция и запуск привели к исключению NSInvalidArgumentException, упомянутому выше.

Я подозревал, что, возможно, есть класс, названный так, но googling на UIDateLabel показал только некоторые неясные хиты (и ни один из них не связан с Apple, как я мог видеть). Поэтому я предположил, что некоторая проблема именования на некоторое время... пока я не прочитал ответы здесь и не попробовал.

Итак, я заменил имя на UIDateLabelAbc, и все работает отлично. Переименование обратно в UIDateLabel не работает, поскольку XCode сообщает мне, что есть класс с таким именем. Поэтому я сделал еще несколько поисковых запросов и нашел страницу wiki, которая утверждает, что перечисляет иерархию наследования UIKit.framework, и в этом списке я нашел список UIDateLabel. Однако, что вся информация, которую мне удалось найти об этом классе, т.е. Что она существует. То, что он делает, его назначение и т.д., Пока неизвестно мне.

Update: После прочтения соглашений об именах я теперь понимаю, что префикс ваших классов с пользовательским интерфейсом не является хорошей практикой (по меньшей мере). Итак, не префикс своих классов с пользовательским интерфейсом, и вы избежите этого и, вероятно, кучу других проблем.

Ответ 6

Я получаю эту ошибку, когда объявляю переменную IBOutlet, и даю ей то же имя, что и другое в этом контроллере. Переименование моих переменных и функций более разумно поэтому решило проблему