未在委托上调用 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 专家,但你的控制器符合协议吗? 请注意 CAAnimationdelegate 很强大,因此您可能需要将其设置为 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 委托方法的主要内容,如果未能解决你的问题,请参考以下文章

UItextView 委托方法未在子视图内调用

加速度计 didAccelerate 委托方法未在 iOS sdk 6.0 中调用

如何在 animationDidStop 委托中识别 CAAnimation?

UIPickerView 委托未在子视图中调用

UIPopoverController 委托未在解雇时被调用

MonoTouch - UIView.Animate 完成回调未在按钮 touchUpInside 委托内调用