2016-05-12 56 views
0

我有一個UIViewController(一個隱藏的UINavigationController),其中包含一個UIButton。點擊按鈕在另一個UIViewController上調用instantiateViewControllerWithIdentifier(並傳遞第二個UIViewController的一些數據)。instantiateViewControllerWithIdentifier打破UINavigationController的流動

嘗試,因爲我可能,我不能得到第二的UIViewController以顯示其的UINavigationController的導航欄,即使我有它嵌入在UINavigationController的。儘管如此,這並不是一場災難,因爲我並不是真的想要它,而只是隱藏它。我在第二個UIViewController中添加了一個UIButton,並在Interface Builder中通過單擊並拖動鼠標來添加一個「Show」segue回到第一個UIViewController。

但是現在,當您訪問的任何其他的UIViewController(和後,按照上述步驟),該UINavigationBar的缺失。

這裏是我是如何加載第二的UIViewController:

let destinationViewController = self.storyboard?.instantiateViewControllerWithIdentifier("viewGold") as! SecondViewController 
destinationViewController.results = result 
self.presentViewController(destinationViewController, animated: true, completion: nil) 

所以:

  1. 它是可怕的我想不是兩個UIViewControllers的顯示UINavigationBar的?
  2. 我是否正確加載SecondViewController?
  3. 有沒有辦法模仿點擊SecondViewController的UIButton點擊「返回」UINavigationBar?

回答

1

所以self.presentViewController是一種模式的演示文稿,這意味着它不包含在您的UINavigationController的導航堆棧中,因此不會顯示您的導航欄。你在這裏提出正確的方法。

問題出在您從第二個視圖控制器到第一個視圖控制器的過程中。實際上,segue創建了一個新的視圖控制器並以模態方式呈現它,這絕對不是您想要的(特別是因爲它創建了您的第一個視圖控制器而不是它是導航控制器)。相反,使用self.presentingViewController.dismissViewControllerAnimated來解除模態。

模態呈現不提供沿導航堆棧移動的相同類型的轉換,這意味着您不會獲得左/右轉換。一般來說,如果您想要像這樣導航,我會建議保持導航欄可見並在導航堆棧上工作。

For reference, look at Apple's documentation on segues!

+0

非常感謝您的解釋。這正是我需要了解問題並解決了我的問題。 –

+0

我的問題是,我模式顯示第二個視圖控制器,而不是將其添加到堆棧。 以下是我固定它: 'self.presentViewController(destinationViewController,動畫:真實,完成:無)' 到: 'self.navigationController .pushViewController(destinationViewController,動畫從第一視圖 - 控制 更改來電:真)' 改變的UIButton在第二控制器點擊來自: 'self.presentingViewController .dismissViewControllerAnimated(真,完成:無)' 到: 'self.navigationController .popViewControllerAnimated(真)' –

0
  1. 這不是一個編程問題,而是一個設計問題。因此我們無法回答,因爲沒有正確的答案。
  2. 是的,但它沒有意義,因爲這正是具有酒吧的導航控制器的用途。

您試圖通過發明解決方案來解決框架理解的不足。

爲了解決這個問題: 如果你想展示一個嵌入到導航控制器內部的控制器,那麼實際上你需要提供導航控制器,因爲它將在演示後攜帶所需的控制器。 因此,只需介紹導航控制器就是這樣。

任何UIViewController子類有一個叫做.navigationController可選屬性。如果有導航控制器,它會爲您帶來第一個直接的父母。因此,通過此屬性獲取目標控制器的導航控制器。