instantiateViewControllerWithIdentifier中断了UINavigationController流程

时间:2016-05-12 22:09:52

标签: iphone swift uiviewcontroller uinavigationcontroller

我有一个包含UIButton的UIViewController(带有隐藏的UINavigationController)。单击该按钮会在另一个UIViewController上调用instantiateViewControllerWithIdentifier(并传递第二个UIViewController的一些数据)。

尽我所能,我无法让第二个UIViewController显示其UINavigationController navigationBar,即使我已将其嵌入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. 有没有办法模仿点击"返回" UIButton中的UINavigationBar单击SecondViewController?

2 个答案:

答案 0 :(得分:1)

所以self.presentViewController是一个模态表示,这意味着它不包含在你的UINavigationController的导航堆栈中,因此不会显示你的导航栏。你在这里呈现正确的方式。

问题在于你从第二个视图控制器到第一个视图控制器。 Show segue实际上创建了一个新的视图控制器并以模态方式呈现它,这绝对不是你想要的(特别是因为它创建了你的第一个视图控制器没有它的导航控制器)。相反,请使用self.presentingViewController.dismissViewControllerAnimated以模态方式解除。

以模态方式呈现并不提供沿导航堆栈移动的相同类型的转换,这意味着您将无法获得左/右转换。通常,如果您想要导航,我建议您保持导航栏可见并在导航堆栈上工作。

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

答案 1 :(得分:0)

  1. 这不是编程问题,而是设计问题。因此,我们无法回答这个问题,因为没有正确答案。
  2. 是的,但它毫无意义,因为这正是带有条形图的导航控制器的用途。
  3. 您正试图通过发明变通方案来解决缺乏框架理解的问题。

    解决这个问题: 如果你想要一个嵌入在导航控制器中的控制器,那么实际上你需要提供导航控制器,因为它会在演示后随身携带所需的控制器。 所以只需出示导航控制器即可。

    任何UIViewController子类都有一个名为.navigationController的可选属性。如果有导航控制器,它将为您提供第一个直接父级。因此,通过此属性获取目标控制器的导航控制器。