Как сбросить делегат на UIView setAnimationDelegate: call? - PullRequest
2 голосов
/ 13 мая 2010

Я получаю отчеты о сбоях, которые появляются из анимации UIView, вызывающей делегата, который был освобожден.

    Thread 0 Crashed:
0   libobjc.A.dylib                 0x334776f6 objc_msgSend + 18
1   UIKit                           0x31c566c4 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
2   UIKit                           0x31c565d2 -[UIViewAnimationState animationDidStop:finished:]
3   QuartzCore                      0x30045a26 run_animation_callbacks

Я устанавливаю текущий контроллер представления в качестве делегата для анимаций, используя следующий шаблон:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelegate:self];
...
[UIView commitAnimations];

Мой вопрос: как мне установить эту делегатскую ссылку на nil в моем методе dealloc? Есть ли способ сохранить ссылку на анимацию? Или загружать анимацию в процессе?

1 Ответ

3 голосов
/ 21 мая 2010

Класс CALayer обрабатывает все анимации для UIViews. Вы можете получить доступ к слою UIView, используя свойство layer. Если бы вы заменили первый аргумент [UIView beginAnimations: context:] реальной строкой, можно было бы получить доступ к этой анимации напрямую, используя animationForKey: и removeAnimationForKey: методы CALayer.

В этом случае, однако, может быть достаточно позвонить [view.layer removeAllAnimations] до того, как dealloc вызовет [super dealloc]. Это остановит любые пользовательские анимации UIView и, очевидно, удалит их из слоя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...