如何在UIView setAnimationDelegate上取消设置委托:调用?

时间:2010-05-12 23:49:43

标签: iphone objective-c cocoa-touch animation uikit

我收到的崩溃报告似乎来自一个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];

我的问题是,如何在dealloc方法中将该委托引用设置为nil?有没有办法保留对动画的引用?或者正在获取正在进行的动画?

1 个答案:

答案 0 :(得分:3)

CALayer类处理UIViews的所有动画。您可以使用layer属性访问UIView的图层。如果您要使用实际字符串替换[UIView beginAnimations: context:]的第一个参数,则可以使用CALayer的animationForKey:removeAnimationForKey:方法直接访问该动画。

但在这种情况下,在[view.layer removeAllAnimations]调用dealloc之前调用[super dealloc]可能就足够了。这将停止任何自定义UIView动画,显然,将它们从其图层中删除。