如何切换ViewController而不是添加到堆栈?

时间:2012-03-16 12:28:50

标签: iphone ios ipad uiviewcontroller uistoryboard

我有一些对象以圆圈形式相互链接。每个对象都包含对它的邻居的引用,square和triangle是不同的类类型:

Each object holds a reference to it's neighbors, square and triangle are different class types

两个类,三角形和正方形,使用ViewController可见,并且它们通过segues相互链接。

到目前为止,没问题。然而,当我在我的结构中浏览时,我不断地将ViewControllers添加到彼此之上。这不仅在内存方面看起来很糟糕,而且还存在这样的问题:当我想要退出这个结构时,我必须通过关闭我打开的所有ViewControllers来回溯。

所以我正在寻找的是一种不在堆栈中当前on的基础上添加下一个ViewController的方法,而是将当前的ViewController替换为下一个。

我一直在寻找解决方案,但收效甚微。所以我觉得做我想要的事情要么是不可能的,要么我只是没有明显的观点而且不知道该寻找什么。我是否需要这样的RootViewController?或者我应该创建一个自定义segue,在添加新的ViewController之前解散旧的ViewController?我真的很茫然。

5 个答案:

答案 0 :(得分:2)

在viewDidLoad中添加所有子视图一次,然后在你想要在viewController中显示该视图的地方为你所有的SubView提供标签,不要添加它只需通过调用函数[[self.view viewWithTag: 1] bringToFront]

答案 1 :(得分:1)

由于您可能正在使用navigationcontroller,因此您应该查看UINavigationController参考。有一些方法可以修改导航堆栈。您不能仅使用故事板来执行此操作。您需要一些自定义代码。

答案 2 :(得分:1)

您应该查看UINavigationController方法setViewControllers:animated:

答案 3 :(得分:1)

听起来你想做几件事之一

  1. 替换您的rootViewController
  2. rootViewController充当单个UIViewController的容器,并根据需要进行更改。在iOS 5中,您可以使用自定义UIViewController, but or you could use one which Apple provided. UINavigationController执行此操作,但除非您还使用它来导航树状视图控制器的结构,否则它可能不是最佳选择。
  3. 你最好的答案取决于你的需要。

    如果您的控制器没有多少状态或者没有进行大量的交换,您可以使用选项1.

    如果您希望用户经常快速地在控制器之间切换和/或您的控制器需要进行大量设置或具有大量状态,那么您可能需要NSArray并且只需使用presentViewController:animated:completion:来显示不同的需要时控制器。将您的控制器存储在NSArray中有额外的好处,可以轻松识别他们的邻居。

答案 4 :(得分:1)

UINavigation controler的方法setViewControllers是一个选项。

另一种方法是使用popViewControllerAnimated弹出最多的视图控制器: 在某些情况下popToRootViewControllerAnimated:会是最好的甚至是popToViewController:animated:。不过,我个人并没有成功使用popToViewController:animated:但那可能是我当时的错。

是的,我认为您需要一个根视图控制器。我自己试图在前几天交换根视图控制器,但没有这样做。最后,它可能不是最优雅的解决方案,但我更容易实现一些虚拟的根视图控制器,它不会在后台显示我的应用程序徽标(与默认图像相同但移动到负坐标以匹配默认值启动时的图像。它位于导航栏和状态栏的“后面”。)。它可能会显示一些空的黑色背景。最终它很可能永远不可见。