2011-12-19 9 views
2

アプリを横長モードで実行したときに、ビューコントローラのビューが2回目にロードされ、loadViewが呼び出され、iOS 5がルートビューコントローラのビューをまた、View ControllerのwillRotate/willAnimateRotation/didRotateメソッドを呼び出すこともありません。iOS 5がloadViewが2回目に呼び出されたときにビューを自動回転させない

これは、ビューがアンロードされた後で、loadViewが2度目に呼び出された後にのみ発生します。私のアプリでは、私は時々私はそれをルートビューコントローラとして設定する前に、プログラムでビューコントローラのビューをアンロードします。ただし、メモリの警告が低いため、ビューコントローラのビューが自動的にアンロードされたときにも発生します。

これは、iOS 4.xではなくiOS 5でのみ発生します。それは、iOSのシミュレーターで再現するのは簡単だし、ここでこの問題を再現するスタンドアロンのテストアプリへのリンクです:

http://www.mediafire.com/file/7ob5xw5ym02pasx/ViewControllerTest.zip

問題を参照するには、単にアプリをコンパイルしてランドスケープモードで起動iOS 5.0 Simulatorを起動し、「A」をタップして「戻る」をタップすると、回転がどのように起こらないかがわかります。

アイデア?これは私が設定している方法と関係がありますかwindow.rootViewController

答えて

4

私はそれを使ってデバッグしましたが、4.3と5.0の間に変更があるようです。 4.3 UIKit呼び出しで[UIWindow addRootViewController:]を呼び出し、5.0では[UIWindow setRootViewController:]を呼び出します。そのため、おそらく何かがないで(したがってがnilにビューを設定しない[newController setupStuff]を使用してではなく、

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    // do setup stuff here, reset content etc etc. 
} 
をオーバーライドし、私はこの問題を回避作業をお勧めしたい

...私たちが見ることができない変更しました

(実際に画面に表示される前に)(既にロードされている)ビューをリセットします。

追加情報:

a)は、あなたがnilにビューを設定する必要はありません。システムはそれをあなたのために行います。このプロパティにアクセスし、その値が現在nilの場合、ビュー コントローラは自動的にloadViewメソッドを呼び出します

:あなたは、そのビューコントローラのビュープロパティ次回にアクセスすると、システムは、ビューを再作成するloadViewを呼び出します結果として表示される を返します。デフォルトのloadViewメソッドは、ビューコントローラー(存在する場合)に関連付けられたnibファイルからビュー をロードしようとします。

b)iOS 5では、ウィンドウのrootViewControllerプロパティに関するすべての現象が発生します。 IOSの5では、これら二つはない等価である:

[self.window.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
[self.window addSubview:newController.view]; 

self.window.rootViewController = newController; 

前者は完全に向きを無視し、後者はありません。

1はloadViewをオーバーライドし、代わりにシステムの空のUIViewを自動作成することができますのみviewDidLoadのビューは、メモリの警告が自動的にビューを設定しないことを修正していない場合は、物事はさらに複雑にするためにnilにして、それを解放する - ドキュメント:

The default implementation releases the view only if it determines that it is safe to do so. 

マジック。メソッドがメソッドをオーバーライドするかどうかによって異なります。私は本当にこれをどのような方法でもテストすることはできません。

ケース1からloadViewを上書き:
は、メモリの警告をトリガが両方didReceiveMemoryWarningviewDidUnload

ケース2呼び出す - いいえloadView
シミュレータのメモリ警告をトリガのみ通話didReceiveMemoryWarningではなくviewDidUnload

私は、ビューを手動で追加するといいでしょう...

歓声。

+0

提案していただきありがとうございます - 残念ながら、ビューがシステムによって(ビューコントローラがメモリ不足の警告に応答して)nilに設定されている場合は動作しません。 –

+0

私は参照してください。私の見解では、テスト時には、ビューをnilに設定し、同じイベントループでrootViewControllerを切り替えると、実際にはビューコントローラに伝播されない方向の問題が発生していました。ウィンドウ内にrootViewControllerを設定しても問題は発生しませんでした。だから多分メモリ操作に 'viewDidUnload'を使い、' viewWillAppear'で他のことをするのが良いでしょうか? – k1th

+0

@k:ありがとう。同じイベントループ(メモリ警告など)で発生しない場合でも、それはまだ問題です。回転イベントが呼び出されていないだけでなく、手動で呼び出す場合でも、画面が実際には回転しないので、これを回避する方法さえもわかりません。私はあなたがiOS 5でこれを行うと思われる方法を知りません。 –

関連する問題