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

时间:2017-11-07 01:52:38

标签: ios swift modalviewcontroller presentmodalviewcontroller

我正在尝试解除模态控制器,然后通过按下第一个模态控制器上的按钮来呈现新的模型控制器。我试过这个:

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

            })

但是一旦当前视图控制器被解除,它就会被解雇并且不会导航到下一个控制器。此外,我们使用笔尖而不是故事板和segues,所以我将无法访问这些。知道如何解除当前的模态视图控制器,而不是提出一个新的模态视图控制器吗?

2 个答案:

答案 0 :(得分:4)

我会尝试在这里给出更多答案。在iOS中编程时,必须从其他实例创建所有实例。当我说实例时,我指的是一个已经实例化的对象(一个已在计算机内存中创建的对象)。因此,无论何时使用XCode创建项目,您始终需要标记'初始视图控制器' (See that the bottom right says 'is initial View Controller, ask yourself... why does XCode really need to know that?')这将是您创建的第一个实例。然后它用于产生其他实例。 Apple选择这种架构的原因是出于安全考虑(我认为......如果有更好的答案,有人会纠正我)。您可以清楚地看到所有'实例'的意见。在XCode 中运行程序时单击此按钮。然后,您可以看到视图的层次结构。我做了一个简单的程序,单击按钮将加载不同的视图。在这里我没有点击按钮,我只加载了一个视图。 Before I click the button and add a new view但是在这里,我点击了按钮并加载了下一个视图enter image description here。在顶部,他们都说 UIWindow 。那是因为......(我希望你能猜到这一部分!)它们都是从UIWindow View中实例化的。别相信我?看一下这个!以下是实际的视图层次结构。The one where the button has not been pressedThe one where the button has been pressed。所以,在你没有得到我的观点的情况下。你应该明白,仅仅通过阅读你的问题就很明显你试图从另一个你试图解雇的模型控制器中实例化你的模型控制器。因此,如果模型控制器被解雇,它应该如何实例化另一个模型控制器?另外请记住,最好只在MenuViewController,MainController或VideoController之后命名控制器。单词模型通常在MVC中使用,不应将其用作ViewControllers名称的一部分。 (希望我听起来不是粗鲁的哈哈,我曾经指导初中,所以这就是我教XD的方法)

答案 1 :(得分:1)

尝试:

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])。然后我们命令该控制器执行下一个表示逻辑。祝你好运!