2011-09-13 51 views
1

我遇到問題。我正在開發基於標籤欄的應用程序。在這個應用程序中,當我們想要導航到新的視圖時,我們調用[self.view addSubview:newVC.view]。 newVC是我們想要顯示的新視圖的視圖控制器。當我們想要回到上一個視圖時,我們也使用[self.view removeFromSuperview]ViewDidAppear不會在基於標籤欄的應用程序中調用

因此,換句話說,沒有導航控制器。現在問題是我想更新以前的視圖。由於我們使用的是[self.view removeFromSuperview],viewDidAppear之前的視圖沒有被調用,所以我們沒有辦法刷新該視圖。

我知道,我們採用了瑕疵,但因爲它的大規模應用,並改變它來實現與取大量的時間導航控制器,所以我需要你幫我找到這個問題的解決辦法。我怎樣才能撥打viewDidLoadviewDidAppear或從其子視圖呼叫[self.view removeFromSuperview]以前的觀點?只有在當你跳進控制器通過pushViewController方法

+0

我想你可以在'[self.view removeFromSuperview]'之前嘗試'[super viewDidLoad]'''。我沒有嘗試這個,但我認爲這將工作 –

+0

你不應該自己調用viewDidLoad。這將在你的視圖加載後被調用。如果您手動調用它,將會發生可怕的事情,特別是如果視圖實際上未加載。 –

+0

爲什麼不把父視圖控制器引用到子視圖中,並通過調用您實現的特定方法來操縱它,以便您對其進行處理? – Saran

回答

0

是的,正如莎拉說,你應該在「堆棧」堅持以前的控制器的引用。 當從堆棧「彈出」控制器時,請在前一個控制器上調用適當的方法。 當然,您不應該調用viewDidLoad(當您從實際UINavigationController的導航堆棧中彈出控制器時,不會調用它)。 您可以撥打viewWillAppearviewDidAppear,但更好的使用自己的方法,如viewRevealed(您也可以從viewWillAppearviewDidAppear稱呼它)。在實現所有這些功能的基類中製作 以及從基類派生所有控制器是非常有用的。它可能看起來像:

- (void) pushViewController:(BaseViewController *)baseController{ 
    [self.view addSubview:baseController.view]; 
    baseController.parentController = self; 
} 
- (void) pop{ 
    [self.view removeFromSuperview]; 
    [self.parentController viewRevealed]; 
} 
+0

非常感謝弗拉基米爾。 – Aqueel

0

viewDidLoad方法調用。如果您撥打removeFromSupreView,它會調用viewWillAppear方法。在這裏,如果你想通過tabbar從一個視圖導航到另一個視圖,你必須使用Mainwindow.xib中的UINavigationController,並將其viewController與App委託連接起來。

相關問題