2016-04-15 27 views
0

我在單個導航控制器中嵌入了多個視圖控制器。 我將如何顯示更早的vc從vc進一步向下。 這是我曾嘗試:以編程方式在swift中顯示現有視圖控制器

let vc = self.storyboard?.instantiateViewControllerWithIdentifier("MenuViewController") as! MenuViewController 
     self.presentViewController(vc, animated: true, completion: nil) 

這並不工作,並返回以下錯誤:

fatal error: unexpectedly found nil while unwrapping an Optional value 

enter image description here

+0

'「MenuViewController」'絕對正確嗎? – zcui93

+1

人們正在解答你的錯誤,但修復你的錯誤並不會改變這樣的事實,即這樣做會創建一個新的視圖控制器並呈現它,而不是回到你現有的控制器。您需要在導航控制器上使用展開的順時針或彈出/解除方法之一返回。 – dan

+0

您是否想要放鬆導航控制器中的視圖控制器堆棧以返回到先前的視圖控制器(unwind segue),還是想將新的視圖控制器推到導航控制器上(代碼隱含的內容)? –

回答

-1

避免被迫在任何時候展開!

if let storyboard = self.storyboard{ 
    if let vc = storyboard.instantiateViewControllerWithIdentifier("MenuViewController") as? MenuViewController { 
    self.presentViewController(vc, animated: true, completion: nil) 
    } 

} 

這將停止應用程序崩潰而不是整個解決方案到您的問題。 MenuViewController標識符錯誤或故事板爲零。

+0

,當我改變爲'讓vc = self.storyboard?.instantiateViewControllerWithIdentifier(「MenuViewController」)爲? MenuViewController',Xcode要求我將'as?'更改爲'as!' –

+0

不要忘記if和大括號。您可能必須先解包故事板。 –

+0

我添加了if語句,並檢查了代碼確實輸入了它,但確實發生了同樣的錯誤。所以我必須對'self.presentViewController(vc,animated:true,completion:nil)''有問題嗎? –

0

假定您已經正確拼寫了「MenuViewController」,很可能是您沒有正確添加故事板標識符到視圖控制器。

轉到故事板並單擊相關視圖控制器,單擊Identity Inspector並在Storyboard ID框中輸入「MenuViewController」。

此外,將您的代碼更改爲Andrew的最佳實踐。

+0

你錯過了這個問題的編輯嗎? – Caleb

+0

哎呀,我已經開放了一段時間。當你使用if let時會發生什麼?你最近是否清理過這個項目? –

+0

另外,你有沒有試過展開它,還是這不符合流? –

0

我不太清楚你想用上面的代碼實現什麼,但是如果你想回到以前的視圖控制器,你應該使用一個委託來告訴呈現VC它完成了它的工作和那麼呈現視圖控制器應該使用導航控制器解除它。視圖控制器應該避免自己解散,因爲他們不知道它們是如何呈現的,它應該總是(至少99%的時間)成爲被解散的呈現器,因爲它知道它是如何呈現它的。

考慮到這一點,你可以關閉該VC在使用導航控制器:

self.navigationController?.popViewControllerAnimated(true)

self.navigationController?.popToViewController(<#MyViewController Reference#>, animated: true)

相關問題