【问题标题】:How do I switch ViewController instead of adding to stack?如何切换 ViewController 而不是添加到堆栈?
【发布时间】:2012-04-01 23:51:41
【问题描述】:

我有许多对象在一个圆圈中相互链接。每个对象都包含对其邻居的引用,正方形和三角形是不同的类类型:

三角形和正方形这两个类通过 ViewController 可见,并通过 segues 相互链接。

到目前为止,没问题。然而,当我浏览我的结构时,我不断地添加 ViewControllers。这不仅在记忆方面似乎是一种不好的做法,而且还存在一个问题,即当我想退出这个结构时,我必须通过关闭我打开的所有 ViewControllers 来回溯。

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

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

【问题讨论】:

    标签: iphone ios ipad uiviewcontroller uistoryboard


    【解决方案1】:

    在 viewDidLoad 中添加所有 subView 一次,然后在要在 viewController 中显示该视图的位置为所有 SubView 提供标签,不要添加它,只需通过调用函数 [[self.view viewWithTag: 1]带到前面]

    【讨论】:

    • 当程序扩展时,这不是内存效率非常低吗?
    • 不,这不是 bcz,而是一次又一次地添加子视图,您只是在更改堆栈中的位置。
    • 但我必须一次将整个数据集加载到子视图中。我希望我现在可以避免这种情况。
    【解决方案2】:

    由于您可能正在使用导航控制器,因此您应该查看 UINavigationController 参考。有一些方法可以修改导航堆栈。您不能仅使用情节提要来做到这一点。您将需要一些自定义代码。

    【讨论】:

    • 我目前没有使用 NavigationController,但我想如果需要我可以。
    • 是的,使用导航控制器。如果您愿意,可以隐藏导航栏。一个开关只是一个弹出,然后是一个推动。最好的方法是 ) 不带动画弹出,然后用动画推送,或者 2) 带动画弹出,不带动画推送;取决于你要去的方向。或者干脆从不使用动画。
    【解决方案3】:

    你应该看看 UINavigationController 方法setViewControllers:animated:

    【讨论】:

      【解决方案4】:

      听起来你想做几件事中的一件

      1. 替换你的rootViewController
      2. 有一个rootViewController,它充当单个UIViewController 的容器,并根据需要进行更改。在 iOS 5 中,您可以使用自定义 UIViewController, but or you could use one which Apple provided.UINavigationController` 来做到这一点,但除非您也使用它来导航视图控制器的树状结构,否则它可能不是最佳选择。

      您的最佳答案取决于您的需要。

      如果您的控制器没有太多状态或没有频繁地换入和换出,您可以使用选项 1。

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

      【讨论】:

        【解决方案5】:

        UINavigation 控制器的方法 setViewControllers 是一个选项。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-17
          • 2021-06-15
          • 2010-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多