【问题标题】:Changing ViewController programmatically以编程方式更改 ViewController
【发布时间】:2015-01-24 06:52:09
【问题描述】:

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

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

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

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

非常感谢!

编辑:我要补充一点:我的测试应用程序不应该为不同的视图控制器提供任何类型的导航(没有标签,也没有类似的东西)。它基本上像 screen1->screen2->screen3->screen4 一样工作。如果按下重置按钮,它会返回到 screen1。我只是对交换 ViewController 感兴趣,没有别的。

【问题讨论】:

  • 这真的取决于您希望如何在应用中构建导航

标签: ios swift uiviewcontroller


【解决方案1】:

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

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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    1。 基本方式有:

    navigationController?.popViewControllerAnimated(true)
    

    或者只是弹出到根视图

    navigationController?.popToRootViewControllerAnimated(true)
    

    推送也可以类似

    或设置一个新堆栈

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

    这些是推荐的代码导航方式,只需选择适合您特定情况的一种即可。

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

    1. 尽量始终使用导航控制器,并且只在适当的时候使用模态视图。

    在主视图中导航时使用导航控制器。模态视图可用作侧视图或以模态方式呈现该视图的视图的扩展。

    编辑: 在应用程序中导航有多种提高效率的方法。在这种特殊情况下,推送和弹出导航堆栈可能是最好的方法。但请记住,有标签栏控制器、集合视图等。归根结底,最好的办法是查看您的应用程序结构,并据此决定哪种导航方法最适合您。

    【讨论】:

    • 这是您可以使用导航控制器的方式,但是有很多方法可以在没有导航控制器的情况下构建应用程序
    • 有,很抱歉我没有涵盖所有这些,但他要求推荐的方法。导航控制器是苹果推荐的标准导航方式,我觉得没有必要投反对票。
    • 这个问题实在是太宽泛了。是的,导航控制器是一种推荐的导航方式,但我确实有问题的第 2 点 - 我认为您的意思是除非必要,否则要避免模态呈现,这很公平,但说“始终使用导航控制器”是不正确的。有选项卡控制器、集合视图、显示视图控制器的任意数量的方式。即使修改根视图控制器也可以
    • 你说得对,我知道我可以用其他词。我会编辑我的答案谢谢。
    猜你喜欢
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 2015-08-16
    相关资源
    最近更新 更多