关闭当前的模态视图控制器,然后呈现新的模态视图控制器

Posted

技术标签:

【中文标题】关闭当前的模态视图控制器,然后呈现新的模态视图控制器【英文标题】:Dismiss current modal view controller and then present new modal view controller 【发布时间】:2017-11-07 01:52:37 【问题描述】:

我试图关闭一个模态控制器,然后通过按下第一个模态控制器上的按钮来呈现一个新的模型控制器。我试过这个:

dismiss(animated: true, completion: _ in
                self.navigateToAtmDetail(atmId:id)

            )

但是一旦当前视图控制器被解除,它就会保持被解除并且不会导航到下一个控制器。此外,我们使用 nibs 而不是 storyboard 和 segues,所以我无法访问它们。知道如何关闭当前的模态视图控制器而不是呈现一个新的模态视图控制器吗?

【问题讨论】:

你应该在展示视图控制器中展示新的,而不是模态的。 navigationToAtmDetail函数里面的代码是什么。 【参考方案1】:

我将尝试在这里给出更全面的答案。在 ios 中编程时,所有实例都必须从...其他实例创建。当我说实例时,我的意思是已实例化的对象(已在计算机内存中创建的对象)。因此,每当您使用 XCode 制作项目时,您总是需要标记'初始视图控制器'。 这将是您创建的第一个实例。然后它用于生成其他实例。 Apple 选择这种架构的原因是出于安全原因(我认为......?如果他们有更好的答案,请纠正我)。您可以非常清楚地看到视图的所有“实例”。 在 XCode 中运行程序时单击此按钮。然后您可以看到视图的层次结构。我制作了一个简单的程序,单击按钮将加载不同的视图。在这里我没有点击按钮,我只加载了一个视图。 但是在这里我点击了按钮并加载了下一个视图。在顶部他们都说 UIWindow。那是因为......(我希望你能猜到这部分!)它们都是从 UIWindow 视图中实例化的。不相信我?看一下这个!这是实际的视图层次结构。 和 。所以,在你不明白我的意思的情况下。您应该明白,只需阅读您的问题,很明显您正试图从另一个您试图解除的模型控制器实例化您的模型控制器。因此,如果模型控制器已被解除,它应该如何实例化另一个模型控制器?还请记住,最好仅根据它们的用途命名您的控制器,例如 MenuViewController、MainController 或 VideoController。模型一词通常在 MVC 中使用,它不应该用作 ViewControllers 名称的一部分。 (希望我不是粗鲁,我曾经辅导过初中,所以这就是我教XD的方式)

【讨论】:

非常舒缓眼睛的答案!【参考方案2】:

试试:

let presenting = (self.presentingViewController.childViewControllers[0] as! <VIEWCONTROLLERTYPE>) //Or whatever index your controller is!
dismiss(animated: true, completion: _ in
                presenting.navigateToAtmDetail(atmId:id)

            )

您的演示控制器的类型在哪里。您还必须将 navigateToAtmDetail 方法移动到另一个控制器

简短的解释(更好,下面的答案中的详细解释)是您不能将新控制器从已经被解雇的控制器上呈现出来。因此,我们想回到向我们展示的控制器 (presentingViewController),它恰好是 navigationViewController。这没有我们想要的逻辑,所以我们需要子视图控制器(childViewControllers[x])。然后我们命令该控制器执行下一个表示逻辑。祝你好运!

【讨论】:

我知道你要去哪里,但它返回错误:实例方法'navigateToAtmDetail'不是'BGMATMLocatorDetailViewController'的成员类型 抱歉,您可能在评论时编辑了帖子。再次检查! 好的,我又试了一次,它抛出了一个 EXC_BAD_INSTRUCTION ,在展开可选值时意外发现 nil 它说 self.presentingViewController = nil 做到了!感谢您的帮助!

以上是关于关闭当前的模态视图控制器,然后呈现新的模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

在后台关闭模态视图控制器

在当前可见之前关闭先前呈现的模态视图控制器

将模态呈现的视图控制器关闭到不同的底层视图控制器

关闭从模态呈现的视图控制器翻转的视图控制器

关闭由模态视图控制器呈现的 UIAlertController

如何从 appdelegate 呈现和关闭模态视图?