以编程方式更改ViewController

时间:2015-01-23 22:20:58

标签: ios swift uiviewcontroller

我一直在寻找解决方案很长一段时间,但我仍然没有看到最佳解决方案是什么: 我正在尝试以编程方式交换视图控制器,故事板中没有任何内容,纯粹的swift文件。

据我所知presentViewController()只是创建了一个'模式'这将导致前一个ViewController留在内存中(经过测试,deinit永远不会为第一个控制器触发)。我找到的解决方案是切换rootViewController:self.view.window?.rootViewController = ViewController2() - >这会激发第一个deinit

虽然这个解决方案在理论上有效,但我想知道......

  1. 是否有一些推荐的方法或最佳实践如何以编程方式执行此操作?或者它真的只是改变viewRootController的价值?
  2. 如何构建您的应用?您是否使用一个ViewController并交换视图?或者您使用presentViewController将其他ViewControllers作为模态呈现? (我对此完全陌生,我似乎无法找到任何好的来源;大多数文章都涉及故事板)
  3. 非常感谢!

    编辑:我将添加:我的测试应用程序不应该为不同的viewcontrollers提供任何类型的导航(没有标签,也没有类似的东西)。它基本上像screen1-> screen2-> screen3-> screen4一样工作。如果按下重置按钮,它将返回到screen1。我纯粹对交换ViewControllers感兴趣,没有别的。

2 个答案:

答案 0 :(得分:0)

1:更改主窗口的根视图控制器对于交换视图控制器是正确的。

2:通常,不使用交换视图控制器。您可以使用具有根视图控制器(例如主屏幕)的导航控制器,然后根据需要推送其他视图控制器。标签栏视图控制器也非常有用。 https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/CombiningViewControllers.html#//apple_ref/doc/uid/TP40011313-CH6-SW1

希望这有帮助!

答案 1 :(得分:0)

1。 基本方法是:

navigationController?.popViewControllerAnimated(true)

或只是弹出到根视图

navigationController?.popToRootViewControllerAnimated(true)

推动可以类似地完成

或设置新筹码

navigationController?.setViewControllers([viewController], animated: true)

这些是在代码中导航的推荐方法,只需选择适合您特定情况的方法。

推送和弹出机制可能是最常用的一般导航方式。

  1. 尝试始终使用导航控制器,并在适当时仅使用模态视图。
  2. 浏览主视图时使用导航控制器。模态视图可以用作视图的侧视图或扩展,以模态方式呈现该视图。

    修改 有很多方法可以通过应用程序导航效率。在这种特殊情况下,推送和弹出导航堆栈可能是最好的方法。但请记住,有Tab栏控制器,集合视图和其他。在一天结束时最好是查看您的应用程序结构,并根据该结构决定哪种导航方法最适合您。