2012-02-29 63 views
2

我有一個用XIB初始化的iPhone視圖控制器。如何在內存警告吹出後從XIB重新加載UIViewController的視圖?

如果視圖控制器的視圖在內存警告通過時不可見,它將其視圖設置爲零(釋放它)。但是,當一個重疊的視圖被解散並且被清除的視圖再次可見時,Cocoa不會從XIB重新加載;它只是創建一個空白的。這留下了一個空白的白色屏幕和一個破碎的應用程序。

蘋果文檔的UIViewController的的loadView法說,「如果視圖控制器都有一個相關的筆尖文件,此方法加載從筆尖文件的視圖。視圖控制器有一個相關的筆尖文件,如果nibName屬性返回非零價值「。所以我超越loadView只是爲了檢查nibName初始化控制器後,nibName是正確的。所以隨後調用loadView應該從XIB重新加載。我確認loadView在內存警告後再次被調用。

UPDATE:隨着越來越多的測試和記錄,我已經確定了第二viewDidLoad中電話後,該視圖的IBOutlets是不爲零。由於我將它們設置爲零,因此我認爲該視圖確實是從XIB重新加載的。那麼爲什麼它顯示爲全白屏?

感謝您的任何見解。

這裏的viewDidLoad中

- (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

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

您是否實現了'viewDidUnload'? – Costique 2012-02-29 04:55:12

+0

是的。問題是如何重新加載。 – Oscar 2012-02-29 05:05:07

+2

如果你做得對,視圖會自動重新加載。當控制器即將出現時,它會檢測到它的視圖已經被卸載,併發送自己'loadView'。請向我們展示'loadView','viewDidLoad'和'viewDidUnload'中的代碼。 – Costique 2012-02-29 05:10:26

回答

1

的viewControllers查看加載機制內存警告應該是透明的,開發商後。你不應該做一些事情來重新創建視圖。

對於使用nib加載的VC,系統將重新創建視圖並將調用viewDidLoad。 對於以編程方式加載的VC,loadView將被再次調用。

整個循環重複,直到viewDidAppear:你又看到了視圖。

使用案例:

的UITabBarController(2個翼片假定)

用戶對選項卡0 >>轉到標籤1 >>觸發存儲器警告>>上的UITabBarController所有活躍的VC接收存儲器警告>>的UITabBarController將卸載視圖Tab0 >> Tab0收到viewDidUnload:

當用戶切換回Tab 0時,它的視圖將從頭開始從loadView或viewDidLoad開始創建,正如我所說的。

如果你沒有收到這些事件,那麼你的viewController層次結構就會混亂。也許你只是添加了一些VC視圖作爲子視圖的東西或者也許你的VC沒有直接或通過一些容器控制器(UINavigation,UITabBarController等)連接到窗口或者你試圖捲起你自己的containerController並搞砸了。

嘗試瞭解從loadView到viewDidUnload和dealloc的UIViewController生命週期。這很棒。這將有助於編寫好的代碼和設計你的應用程序。

+0

謝謝。我已經閱讀了文檔,而且我沒有滾動我自己的控制器層次結構。這是一個非常簡單的場景:視圖控制器調用照片選擇器,這往往會產生內存警告。當選取器被解散時,底層控制器的視圖已經被釋放並且被重新創建爲白色屏幕。我忽略了控制器的loadView方法,並驗證了當重疊視圖被解除時它確實被調用。它只是不重新加載XIB(是的,它是用一個初始化)。 – Oscar 2012-02-29 05:56:21

+0

@Oscar您是否找到解決方案? – Adriana 2012-11-19 17:42:58

+0

@Adriana:如果您的視圖是由XIB創建的,您可以使用nibname方法重新加載視圖,但是如果它是在沒有Xib的情況下創建的,那麼只需在-loadView方法中提供視圖創建代碼並重新創建視圖,以獲取任何幫助幫助ping我!!! – 2012-12-11 09:03:48

相關問題