2013-07-13 16 views
23

私のアプリケーションが最初にロードされるとき、UIWindowrootViewControllerプロパティをcontrollerAに設定しました。UIWindowのrootViewControllerを変更する

いつか私のアプリではrootViewControllercontrollerBに変更することを選択します。

問題は、私がcontrollerBでフリップトランジションを実行するときに、その後ろにcontrollerAのビューが表示されることがあるということです。何らかの理由でビューが削除されていない。さらに気になるのは、rootViewControllercontrollerBに設定した後、controllerAdeallocメソッドは決して解雇されないということです。

は私が手動でcontrollerBに切り替える前UIWindowのサブビューを削除しようとした、それはまだと呼ばれることは決してありませんSのdealloc controllerA「バックグラウンドが、controllerAでの見解」を見ての問題を解決します。 ここで何が起こっていますか?

リンゴドキュメントは言う:

ルート・ビュー・コントローラは、ウィンドウのコンテンツビューを提供します。このプロパティにビューコントローラを割り当てる(プログラムまたはInterface Builderを使用)と、ビューコントローラのビューがウィンドウのコンテンツビューとしてインストールされます。ウィンドウに既存のビュー階層がある場合、古いビューは新しいものがインストールされる前に削除されます。

UPDATE

ここに私AppDelegateのコードです:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [self showControllerA]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

- (void)showControllerA 
{ 
    ControllerA* a = [ControllerA new]; 
    self.window.rootViewController = a; 
} 

- (void) showControllerB { 
    ControllerB* b = [ControllerB new]; 
    self.window.rootViewController = b; 
} 
+0

アプリケーションデリゲートに 'application:didFinishLaunchingWithOptions:'メソッドのコードを提供できますか? – Cezar

+0

愚かな質問ですが、2番目のコントローラを押すと 'controllerA'をnilに設定しますか?そうでなければ、それはdeallocしません。 (私はあなたがいると仮定しています) – Putz1103

+0

controllerAへのポインタを保持しないので、何をnilに設定するかはわかりません。 – aloo

答えて

11

別の問題が2つあります。 1)コントローラーAでサイクルを保持していたので、決してdeallocされませんでした。第2に、ルートビューコントローラを変更するには、最初にウィンドウのサブビューを削除する必要があります(たとえドキュメントで他にも示唆していますが)。

1

問題がControllerAまたはControllerBの実装であることができ、彼らはコードのようにARCの '自己' を保持することができますあなたはViewControllerを自動的にdeallocできません。 ControllerAとControllerBの実装を投稿できますか?

+0

の凝縮されたバージョンで質問を更新しました。それは、なぜdeallocが呼び出されないのかを説明します。しかし、なぜcontrollerAからの視界がまだcontrollerBの背後に見えるのでしょうか。ルートビューコントローラを変更しても、コントローラAのビューがウィンドウから削除されませんか? – aloo

関連する問題