2012-01-16 16 views
4

iPadがデバイスの向きを変更したときに、次のコードを使用して検出/聴取しています。クラッシュの原因となる通知リスナー

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(didRotate:) 
               name:@"UIDeviceOrientationDidChangeNotification" 
               object:nil]; 

これは、何かが変更されたときに私のdidRotate:メソッドを呼び出します。私のdidRotate:メソッドでは、UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];を使用して向きがわかり、それに応じてコードを適用します。

しかし実際のテストでは、didRotate:iPadが人の手の中にあれば毎秒呼び出されることに気付きました。それはリスナーが文字通り、人の手の中で明らかに(デスクの上にフラットではなく)多くのことが起こる、iPadのすべての小さな傾きとシフトを聞いているようだ。

私はこれをどのように修正することができますか?インターフェイスの向きを使用するようにコードを変更することはできますが、何らかの理由で問題が発生しています。ありがとうございました。

* UPDATE:このリスナーは、私のUIImageViewサブクラスで作成されます。画面には約十数点以上があります。インスタンスを削除するときの削除方法に[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];を追加しました。それは、なぜ回転があまりにも(私のエラー)表示され続けた理由を説明するのに役立ちます。

ただし、このサブクラスのインスタンスを削除してiPadを回転させるとクラッシュします。時々私は[__NSArrayM didRotate]のような奇妙なメッセージを受け取ります:認識できないセレクター(およびUIPanVelocity ... somethingのような他のwierdオブジェクト)です。インスタンスが削除された後でもリスナーはリッスンしていますか?

固定:ありがとうございます。私はついに間違っていたことに気付きました。私は、オブザーバを削除して通知を終了することなくインスタンスを削除していました。私のインスタンスの除去方法に次のコードを追加すると、私の問題が修正されています。

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 
[[NSNotificationCenter defaultCenter] removeObserver:self]; 
+0

、定数 '名を使用します。UIDeviceOrientationDidChangeNotification'ないその文字列値を'名前は:「UIDeviceOrientationDidChangeNotification」が ' – bandejapaisa

答えて

2

私はあなたが繰り返しオブザーバーを追加し、決してそれらを削除しないと思います。これは、単一のイベントに対して同じエントリポイントが複数回呼び出される可能性があることを意味します。また、「自己」オブジェクトが消えたときにクラッシュすることを意味します。サイドノートとして

1

通知だけ別の方向に一方向からデバイスの変更する場合は、送られた - それは必要以上に時間を解雇されません。

UIDeviceOrientationは、UIInterfaceOrientationより2つ多く向きがあります。それはFaceUpとFaceDownを持っています。おそらくそれが引き起こされているのですが、あなたはそれらに興味がありません。

typedef enum { 
UIDeviceOrientationUnknown, 
UIDeviceOrientationPortrait, 
UIDeviceOrientationPortraitUpsideDown, 
UIDeviceOrientationLandscapeLeft, 
UIDeviceOrientationLandscapeRight, 
UIDeviceOrientationFaceUp, 
UIDeviceOrientationFaceDown 
} UIDeviceOrientation; 

たぶん、あなたは、現在画面上にあるビューコントローラでUIInterfaceOrientationの変更を聞くことを好むだろう。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
+0

こんにちは、@、私は私のdidRotate方法でのNSLogを持っており、そのは、そのは常に呼び出されていることを示します。 didRotateを呼び出す唯一のメソッドは、私が前に述べたデバイスの方向リスナーです。だから、リスナーが私のdidRotateを呼び出し続けていることを100%確信しています。私の机の上にiPadを平らに置くと、それは呼ばれません。それが私の手の中にあり、周りを回っていても回転していなくても、didRotateは呼び出されています。ありがとう – user339946

+0

投稿したコードはどこに追加しましたか?たぶんそのビットのコードは、複数のオブザーバを累積して複数回呼び出されるので、didRotate:同じオブザーバではあるが、オブザーバごとに1回、複数回呼び出されます。 – bandejapaisa

+0

こんにちは、これは正しいです。このリスナーは、私が画面に表示するすべてのUIImageViewに入ります(最大約12個以上)。私はこれにクラッシュを絞り込んでいます。私は[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]を追加しました。私の除去方法に。イメージビューが削除されるたびに、iPadを移動したときのように見えますが、クラッシュします。 – user339946

関連する問題