2012-02-29 5 views
2

私はXIBで初期化されたiPhoneビューコントローラを持っています。メモリ警告が吹き飛ばされた後、どのようにXIBからUIViewControllerのビューをリロードしますか?

メモリ警告が発生したときにビューコントローラのビューが表示されない場合、ビューはnil(解放)に設定されます。しかし、重複したビューが閉じられ、クリアされたビューが再び表示されると、CocoaはXIBからそのビューをリロードしません。単純に空白を作成します。これは空の白い画面と壊れたアプリを残します。

のUIViewControllerのloadViewメソッド方法のためのアップルのドキュメントは、ビューコントローラが関連付けられているnibファイルを持っている場合、このメソッドは、nibファイルからビューをロードする」と言う。nibNameプロパティが返す場合、ビューコントローラが関連付けられているnibファイルを持っていますnon-nil値。だからコントローラを初期化した後loadViewnibNameに単にオーバーライドしてください。nibNameが正しいです。したがって、loadViewへのその後の呼び出しは、XIBから再ロードする必要があります。私は、メモリ警告の後にloadViewが再度呼び出されたことを確認しました。

UPDATE:より多くのテストとロギングでは、私は2番目のviewDidLoad呼び出した後、ビューのIBOutletsがnil以外であると判断しました。 viewDidUnloadでそれらをゼロに設定しているので、私はビューが実際にXIBから再ロードされたと結論づけます。だから、なぜそれは全面白い画面として表示されますか?

ありがとうございました。メモリ警告が開発者に対して透過的であるために仮定された後

- (void)viewDidUnload 
{ 
    [_photoViewController release]; 
    [super viewDidUnload]; 
} 
+1

'viewDidUnload'を実装しましたか? – Costique

+0

はい。問題は、リロードする方法です。 – Oscar

+2

これを正しく実行すると、ビューは自動的に再読み込みされます。コントローラが表示されようとすると、ビューがアンロードされたことが検出され、自身に 'loadView'が送信されます。 'loadView'、' viewDidLoad'、 'viewDidUnload'にコードを表示してください。 – Costique

答えて

1

viewControllersは、ローディング機構を表示:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _photoViewController = [[EGOSimplePhotoViewController alloc] initWithPhotoSource:_photoSource 
                     scrollView:bigImageScrollView 
                    enclosingView:photoSquare]; 
    _photoViewController.delegate = self; 

    if(_progressHUD == nil) 
    { 
     if(self.navigationController.view != nil) 
     { 
      _progressHUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; 
     } 
     else 
     { 
      _progressHUD = [[MBProgressHUD alloc] initWithView:self.view]; 
     } 
    } 

    // Add HUD to screen. 
    if(self.navigationController.view != nil) 
    { 
     [self.navigationController.view addSubview:_progressHUD]; 
    } 
    else 
    { 
     [self.view addSubview:_progressHUD]; 
    } 

    [_progressHUD release]; 

    _progressHUD.labelText = @"Loading..."; 
    [_progressHUD show:YES]; 
} 

そしてviewDidUnload

はここのviewDidLoadです。ビューを再作成する必要はありません。

nibを使用してロードされたVCの場合、システムはビューを再作成し、viewDidLoadが呼び出されます。 プログラムによってロードされたVCの場合、loadViewが再び呼び出されます。

と全体のサイクルがviewDidAppearまで繰り返される:あなたは再びビューを参照してください。

使用する場合:

UITabBarController(2つのタブを想定)タブ0に

ユーザ>>タブ1になる>>メモリ警告をトリガ>> UITabbarController上のすべてのアクティブVCがメモリの警告を受け取る>> UITabBarController意志タブ0をアンロードします。>> Tab0はviewDidUnloadを受け取ります。

ユーザーがタブ0に切り替えると、ビューはloadViewまたはviewDidLoadから最初から作成されます。

あなたのViewControllerの階層が台無しにされ、その後、これらのイベントを受信して​​いない場合。たぶんあなたは何かにサブビューとしていくつかのVCビューを追加したか、多分あなたのVCが直接またはいくつかのコンテナコントローラ(UINavigation、UITabBarControllerなど)を介してウィンドウに接続されていないか、あなた自身を巻き戻そうとしましたcontainerControllerと混乱。

loadViewからviewDidUnloadおよびdeallocへのUIViewControllerのライフサイクルを理解してください。それは素晴らしいです。それはあなたのアプリケーションの良いコードとデザインを書くことに多くの助けになります。

+0

ありがとうございます。私はドキュメントを読んだが、私は自分自身のコントローラ階層を動かすつもりはない。これは非常にシンプルなシナリオです。ビューコントローラは、メモリ警告を生成することが多い写真ピッカーを呼び出します。ピッカーが解任されると、下にあるコントローラのビューが解放され、白いスクリーンとして再作成されます。私はコントローラのloadViewメソッドをオーバーライドし、オーバーラップビューが閉じられたときに実際に呼び出されていることを確認しました。 XIBをリロードしていないだけです(はい、初期化されています)。 – Oscar

+0

@Oscar解決策を見つけましたか? – Adriana

+0

@Adriana:XIBでビューを作成する場合は、nibnameメソッドを使用してビューをリロードすることはできますが、Xibなしで作成した場合は、-loadViewメソッドでコードを作成してビューを再作成するだけですping me !!! –

関連する問題