切换屏幕/视图控制器

Posted

技术标签:

【中文标题】切换屏幕/视图控制器【英文标题】:Switching screens/view controllers 【发布时间】:2017-12-02 07:25:24 【问题描述】:

我是一名 android 开发人员,对 ios 开发非常陌生,我想有一个非常基本的问题。

我读到现在最好的做法是为多个视图控制器使用多个故事板并以编程方式浏览它们,例如:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier :"viewController") as! UIViewController
self.present(viewController, animated: true, completion: nil)

假设我有两个故事板。在第一个中,我只有一个 ViewController,而在第二个中,我有两个 ViewController。我使用第一个故事板及其 ViewController 启动应用程序。在点击一个按钮之后,我想使用上面的代码展示下一个带有第一个 ViewController 的故事板。下一个 ViewController 显示没有任何问题,但是第一个故事板 ViewController 发生了什么?它是否仍然存在于堆栈中或被终止或类似的东西?

我问这个是因为如果我打电话

dismiss(animated: true, completion: nil)

在第二个故事板的第一个 ViewController 中,ViewController 消失了,旧的又出现了。 此外,如果我想在第二个故事板的第一个 ViewController 中显示第二个故事板中的第二个 ViewController 时调用此方法,则第一个 ViewController 也会消失并显示第一个故事板中的 ViewController。

在 android 中,如果我想启动下一个屏幕/活动,我会这样做:

startActivity(new Intent(CurrentActivity.this, NextActivity.class));
finish(); //to drop the current activity

当我在 NextActivity 中并单击返回按钮时,整个应用程序将最小化。

我只是想确保不要在我的应用程序中构建大量 ViewController。

【问题讨论】:

【参考方案1】:

所以我假设你想去VC1 -> VC2 -> VC3。当您呈现 VC3 时,无需关闭 VC2。这将创建一个导航堆栈。当您关闭 VC3 时,VC2 仍然存在,与关闭 VC2 相同,VC1 将在那里。如果您希望 VC1 呈现 VC3,当您从 VC1 解除 VC2 时,您需要从解除调用的完成块中呈现 VC3。

【讨论】:

感谢您的回答。我知道如何呈现 ViewControllers。但是,如果我开始另一个 VC,我是否必须解雇每个 VC?比如:VC1 -> VC2 (dismiss VC1) -> VC3 (dismiss VC2) -> 实例化 VC2 (dismiss VC3) 等等 如果我有 100 个 VC 怎么办。如果我展示一次,它们都会在堆栈上吗? 我认为您需要考虑应用的导航。如果您只是从 VC 跳到 VC,那么它不符合通常的 iOS 流程。通常你会向用户展示一个 VC,用户在那里做事并解雇它。或者您有一个UINavigationController,它将VC 推入堆栈,用户可以向前或向后导航。或者一个导航抽屉来切换VC。但你目前的流程最终会很痛苦。 好吧,听起来不错。如果我有应用程序的两个主要部分怎么办..例如使用单个 UINavigationController 在一个故事板中登录/注册/条款/等,另一部分是应用程序的主要部分并且也有一个 UINavigationController 我从第一个故事板切换到第二个,我必须解雇第一个控制器吗? 没有。您可以查看为应用程序的UIWindow 切换当前视图控制器。像这样的东西:***.com/questions/41144523/…【参考方案2】:

很抱歉,如果 Xcode 支持自动布局,那么使用多个故事板是一种不好的做法

您只需使用自动布局。

示例:如果您的视图控制器中有一个 UIButton,并且您想根据 ViewController 的视图减少和增加。然后添加我在下面建议的约束

    为按钮提供一些纵横比。 从界面构建器左侧的视图层次结构中访问按钮,然后按住 ctrl+从按钮拖动到父视图,按住命令选择“等高”、“在容器中垂直居中”、“在容器中水平居中”和然后点击“添加约束” 然后选择您的按钮打开尺寸检查器并双击“高度约束”并根据您的需要给出乘数(注意:它与父视图的高度成正比)。 如果您想移动父视图中心左侧的按钮,请双击“对齐中心 X”并在 1 下方给出乘数(根据您的需要)。 如果您想将按钮移到中心上方,请将“对齐中心 Y”约束的乘数设置为低于 1。

就是这样。只需运行并检查。

如果你想在两个 ViewController 之间切换

    在第一个 ViewController 的按钮的操作中编写以下代码。

        let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "YourSecondVCIdentifier")
    
        self.present(secondVC!, animated: true, completion: nil)
    

    并在SecondViewController的Button动作中编写如下代码。

        self.dismiss(animated: true, completion: nil)
    

【讨论】:

这不是在回答我的问题。你告诉我使用多个故事板不是最佳实践,但究竟为什么呢?您回答中的其他所有内容都是我已经知道并且没有要求的。

以上是关于切换屏幕/视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何从标签栏视图控制器切换到另一个作为导航控制器子视图的视图

视图控制器 IOS 视图间切换

如何在我的 Xcode Swift 项目的不同导航堆栈中从一个视图控制器屏幕切换到另一个?

如何从导航控制器切换到选项卡控制器并使其成为根视图控制器

以编程方式切换选项卡时清除根视图控制器的变量

针对不同屏幕尺寸的不同视图控制器