2013-04-21 5 views
1

У меня есть два подкласса UIView, например «Класс A» и «Класс B». Класс А в его инициализаторе имеет код [self addSubview:instanceOfClassB];. А в классе B drawRect: - это строка кода [self addSubview:imageViewInstance];. Также в классе B drawRect: я присваиваю значения этому объекту imageView animationImages, animationDuration и animationRepeatCount. Однако я также вызываю startAnimating в этом экземпляре UIImageView, но он всегда вызывает сбой приложения. Затем я попытался назвать startAnimating на этом UIImageView, например от drawRect: из надтаблицы класса B, в класс А. Однако он по-прежнему падает с ошибкой:Есть ли метод, вызываемый непосредственно после drawRect :?

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

И имеет «Тема 1: сигнал SIGABRT» сообщение на линии с кодом [imageView startAnimating];.

Я подозреваю, что он сбой здесь, потому что drawRect класса B вызывается после drawRect класса A, поэтому, когда я сообщаю, что просмотр изображения запускает анимацию, он падает, потому что изображение еще не создано. Так что в основном то, что я прошу, это в каком методе я могу сказать, что изображение должно начать анимацию без сбоя?

+0

Вы можете добавить контрольную точку исключения, чтобы увидеть, где именно сбой вашего кода: http://developer.apple.com/library/ios/#recipes/xcode_help-breakpoint_navigator/articles/adding_an_exception_breakpoint.html –

+0

@weichsel - я идентифицировал где именно он падает; проблема в том, что я не могу найти альтернативный способ выполнить то, что я опишу выше. – pasawaya

+0

Вопрос: Почему вы добавляете изображениеViewInstance внутри drawRect? почему не в методе init? –

ответ

2

Модифицирование состояния или методов вызова, не связанных с рисованием из drawRect:, звучит как очень плохая идея. Вы не должны ничего делать в drawRect: кроме рисунка.

drawRect: автоматически вызывается всякий раз, когда вид или часть вида требуют повторной перерисовки. Частота и порядок операций перерисовки определяются системой и зависят от нескольких вещей (иерархия представлений, окклюзия, ...). Таким образом, вы также не можете полагаться на определенный порядок, в который вызывается drawRect:.

Вы можете перенести настройку своих объектов из кода рисования и начать анимацию на основе взаимодействия с пользователем.

+0

Я думаю, великие мысли думают одинаково. Я предпочитаю вашу формулировку, поэтому я удалю свой ответ. – jrturton

+0

Не ответил бы, видел ли я раньше. Это было в основном идентично :) –

+0

@weichsel - Спасибо за ответ, но моя цель состоит в том, чтобы анимация начиналась, когда просмотр загружается, а не в подсказку пользователя. Есть ли способ сделать это? – pasawaya

Смежные вопросы