2015-06-23 63 views
1

我有一個叫做ViewControllerOne的vc,當用戶點擊一個UITableViewCell時,我打電話push segue並導航到ViewControllerTwo。在ViewControllerTwo我隱藏導航欄,所以我創建了一個自定義後退按鈕:viewDidLoad每次調用popViewControllerAnimated後調用:

- (IBAction)backBttn:(id)sender { 

    [self.navigationController popViewControllerAnimated:YES]; 

} 

完美的作品,但viewDidLoad獲取調用(在ViewControllerTwo)每次我導航回到ViewControllerOne,比開放ViewControllerTwo再次。我是對的,viewDidLoad被叫因爲我使用[self.navigationController popViewControllerAnimated:YES]?或者它必須有另一個原因?

+0

在該UIViewController子類是'viewDidLoad'獲取調用多次? – ndmeiri

+0

@ndmeiri in'ViewControllerTwo' – rihe

回答

1

如果我理解你的權利,你看到的viewDidLoad你是推到視圖控制器上調用。 (ViewControllerTwo)。如果您從ViewControllerOne推到ViewControllerTwo,ViewControllerTwo的viewDidLoad正在被調用。

如果單擊後退按鈕彈出ViewControllerTwo,返回ViewControllerOne,然後推到ViewControllerTwo再次,你看viewDidLoad被稱爲第二次。

這是預期的行爲。推塞格(除了展開塞格以外的所有其他塞格)創建他們正在呈現的視圖控制器的新實例。

同樣,啪/解聘重新分配你離開視圖控制器。

+0

謝謝鄧肯,很高興知道這是一種正常的行爲。你認爲這是一個不好的例程,我需要找到另一種解決方案?或者沒關係?其實一切工作正常,但我需要從服務器獲取一些數據,每次我打開'ViewControllerTwo',我有點困惑,我應該這樣做,因爲通常我在'viewWillAppear'中,但在這種情況似乎'viewDidLoad'也很好。 – rihe

+1

通常,您應該避免在每次加載視圖控制器時進行網絡事務。取而代之的是有一個網絡管理員單身人士爲您完成工作,並記住它最近取得數據的時間。當您返回視圖控制器時,請詢問網絡管理員您是否有當前數據。如果是這樣,請使用它。如果沒有,請向網絡管理員申請更新。 –

1

當你取出從導航堆棧視圖控制器,它管理被釋放(或卸載)的圖。因此,當您再次打開ViewControllerTwo時,必須再次加載視圖。這就是爲什麼viewDidLoad在你的情況下被多次調用。