2011-12-26 22 views
3

デリゲートは、私のビューコントローラです。CAAnimationデリゲートメソッドがデリゲートで呼び出されない

私は経由してデリゲートを設定しています:その後、私はアニメーションを設定し、レイヤにアニメーションを追加し、私はそれがデバイスに正しくアニメーションされた検証

CABasicAnimation theAnimation; 
theAnimation.delegate = self; 

しかし、私はこのデリゲートメソッドが呼び出されるように取得することはできません。

-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { 
    NSLog(@"animationDidStop called."); 
} 

任意のアイデア?

また、私のビューコントローラがCAAnimationデリゲートメソッドで採用しているプロトコルはどこにも見つかりませんでした。すべてのデリゲートオブジェクトがプロトコルを採用しなければならないと思いましたか?

ありがとうございました!

+0

申し訳ありませんが、私は目的のCとiOSのエキスパートではありませんが、コントローラをプロトコルに準拠させていますか? – EricSonaron

+0

__「CAAnimation」の 'delegate'が強いことを知っているので、保持サイクルを避けるために' nil'に設定する必要があります!__ –

答えて

2

また、私のビューコントローラがCAAnimationデリゲートメソッドで採用しているプロトコルはどこにも見つかりませんでした。すべてのデリゲートオブジェクトがプロトコルを採用しなければならないと思いましたか?

委任し、正式なプロトコルは、直交概念です:
フォーマルなプロトコルObjective-Cのプログラミング言語にはかなり最近追加されている - 実際のところ、彼らは CoreAnimation(旧姓LayerKit)後を導入しました。

@protocolが導入される前のやり方や、QuartzCoreの方法は、まだ「非公式プロトコル」としてNSObjectにカテゴリを宣言していました。これは、Appleがこれらを正式に開始することをごく最近である - あなたの問題に今、歴史の上に置き、この短い後のiOS/OS Xの

の現在のリリースでそれのデリゲートプロトコルを獲得した、例えばNSURLConnectionを参照してください。

表示している内容がコードの逐語的なコピーである場合、それは動作しません。実際に、あなたがARCを使用していない場合は、EXC_BAD_ACCESSのために上記のコードがクラッシュしないことは大変幸運です。 animationの値を意味のあるものに設定してから、メッセージを送信してください。

+0

優れたプロトコル履歴をありがとう。私が今使っているのは、非公式なプロトコルなので、ヘッダーファイルにデリゲートメソッドを宣言して呼び出す必要があります。私は私の質問の先頭に向かって述べたように、私はアニメーションをデバイス上で正しく動作させることができたので、上記のコードは完全なものではありません。 –

+0

メッセージをnilに送信すると有効で効果がないので、質問のスニペットがクラッシュしません。 –

+1

@AnthonyMattoxはい、 'nil'メッセージはうまくいきます。いいえ、ARCなしでは変数はおそらく 'nil'ではないでしょう:_manual_参照カウントの下では、オブジェクト変数はプリミティブ変数とは異なる扱いを受けませんので、宣言して値を代入しないと、そこにランダムなガベージがあります。しかしながら、ARCは、 'nil 'を用いてローカルオブジェクト変数の初期化を保証する。 – danyowdee

関連する問題