私はそれを使ってデバッグしましたが、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
を上書き:
は、メモリの警告をトリガが両方didReceiveMemoryWarning
とviewDidUnload
ケース2呼び出す - いいえloadView
:
シミュレータのメモリ警告をトリガのみ通話didReceiveMemoryWarning
ではなくviewDidUnload
を 私は、ビューを手動で追加するといいでしょう...
歓声。
提案していただきありがとうございます - 残念ながら、ビューがシステムによって(ビューコントローラがメモリ不足の警告に応答して)nilに設定されている場合は動作しません。 –
私は参照してください。私の見解では、テスト時には、ビューをnilに設定し、同じイベントループでrootViewControllerを切り替えると、実際にはビューコントローラに伝播されない方向の問題が発生していました。ウィンドウ内にrootViewControllerを設定しても問題は発生しませんでした。だから多分メモリ操作に 'viewDidUnload'を使い、' viewWillAppear'で他のことをするのが良いでしょうか? – k1th
@k:ありがとう。同じイベントループ(メモリ警告など)で発生しない場合でも、それはまだ問題です。回転イベントが呼び出されていないだけでなく、手動で呼び出す場合でも、画面が実際には回転しないので、これを回避する方法さえもわかりません。私はあなたがiOS 5でこれを行うと思われる方法を知りません。 –