未在委托上调用 CAAnimation 委托方法
Posted
技术标签:
【中文标题】未在委托上调用 CAAnimation 委托方法【英文标题】:CAAnimation delegate methods not being called on delegate 【发布时间】:2011-12-26 20:17:55 【问题描述】:委托是我的视图控制器。
我正在通过以下方式设置委托:
CABasicAnimation theAnimation;
theAnimation.delegate = self;
然后我配置动画并将动画添加到图层,并验证它在设备上正确动画。
但是,我无法调用此委托方法:
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
NSLog(@"animationDidStop called.");
有什么想法吗?
另外,我在任何地方都找不到我的视图控制器为CAAnimation
委托方法采用的协议。我认为所有委托对象都必须采用协议?
谢谢!
【问题讨论】:
抱歉,我不是 Objective-c 和 ios 专家,但你的控制器符合协议吗? 请注意CAAnimation
的 delegate
很强大,因此您可能需要将其设置为 nil
以避免保留循环!
【参考方案1】:
另外,我在任何地方都找不到我的视图控制器为 CAAnimation 委托方法采用的协议。我认为所有委托对象都必须采用协议?
委托和正式协议是正交的概念: 形式化协议是 Objective-C 编程语言的新成员——事实上,它们是在CoreAnimation(née LayerKit)之后引入的。
在引入@protocol
之前的做事方式——以及QuartzCore
仍然有效的方式——将NSObject
上的一个类别声明为所谓的“非正式协议”。直到最近,Apple 才开始将这些正式化——请参阅 NSURLConnection
以获取此类示例,它在当前版本的 iOS/OS X 中获得了它的委托协议。
在简要介绍一下历史之后,现在来解决您的问题:
如果您展示的是您的代码的逐字副本,那么这是行不通的。事实上,如果您不使用 ARC,那么您很幸运上述代码不会因为 EXC_BAD_ACCESS
而崩溃。在尝试向其发送消息之前,您应该将 animation
的值完全设置为有意义的值...
【讨论】:
感谢优秀的协议历史。我现在知道,我使用的是一个非正式协议,您必须在头文件中声明委托方法才能调用它们。上面没有显示我的完整代码,因为正如我在问题顶部所说的那样,我能够让动画在设备上正常工作。 问题中的sn-p不会崩溃,因为给nil发消息是有效的,没有效果。 @AnthonyMattox 是的,发消息nil
很好。不,如果没有 ARC,该变量可能不是 nil
:在 manual 引用计数下,对象变量的处理方式与原始变量没有区别,因此,如果您声明它们但没有为它们赋值,您' d 那里有随机垃圾。然而,ARC 保证使用 nil
初始化局部对象变量。
我的错,@danyowdee。我似乎认为 ARC 是理所当然的,并错过了解释的细节。以上是关于未在委托上调用 CAAnimation 委托方法的主要内容,如果未能解决你的问题,请参考以下文章
加速度计 didAccelerate 委托方法未在 iOS sdk 6.0 中调用
如何在 animationDidStop 委托中识别 CAAnimation?