3

私はiPadアプリを開発しています。横向きモードと縦向きモードの両方を許可します。私のUIはポートレートモードでは問題ありませんが、ランドスケープモードに変更すると、UIが台無しになります。これに関連するいくつかのSO投稿を見て、UIViewのinitWith...に次のコードを追加しました。

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

これを行った後、私のUIはポートレートモードで正常に動作しています。横向きモードに変更すると、UIは正常です。しかし、ポートレートモードに戻すと、アプリがクラッシュします。アプリのクラッシュに関連するSOに関するいくつかの投稿を読んで、楽器について知ってもらいました。ゾンビを有効にしたところ、すでにリリースされているオブジェクトにメッセージが送信されており、このメッセージはNSNotificationCenterから送信されていることがわかりました。

デバイスの登録以外に処理する必要があるものはありますか?また、実装をUIViewからUIViewControllerに変更し、UIViewControllerがデバイスの向きに関して持っているメソッドを実装できる方法はありますか?これを行うために必要な手順を教えてください。ありがとう!

4

2 に答える 2

5

通知の登録先はどこですか? 有効でなくなったオブジェクトにメッセージが送信されないようにするために、方向を変更しようとしているときにオブザーバーを削除する必要があります (prepForSegue または willAnimateRotationToInterfaceOrientation のいずれかで、セットアップに応じて)。また、viewDidAppear/viewWillAppear に登録する場合、いくつかの通知を重ねたくありません。

次を使用してオブザーバーを削除します。

[[NSNotificationCenter defaultCenter] removeObserver:self];//removes all notifications for that object (the way I've used it before)

または、具体的にしたい場合は、次のようにします。

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:[UIDevice currentDevice];//remove just that notification
于 2013-02-14T19:12:39.303 に答える
0

このUIViewControllerクラスには、向きの変更を処理するいくつかのメソッドがあります。これらの方法の説明については、ドキュメントを参照してください。

調べる必要がある 1 つの方法はviewWillLayoutSubviews. これは、手動のビュー レイアウトを実行する一般的な場所です。これは、View Controller の向きが変わるたびに呼び出されます。

これらの方法を使用することは、デバイスの向きの変更通知に登録するよりもはるかに一般的です。クラッシュに関するあなたの声明に基づいて、考えられる問題は、追加したオブザーバーを決して削除しないことです。への呼び出しごとaddObserverに、対応する への呼び出しが必要removeObserverです。それ以外の場合は、オブザーバーがずっと離れていても呼び出されます。これにより、説明したクラッシュが発生します。

于 2013-02-14T15:55:18.330 に答える