【问题标题】:swift ios cant remove old modal viewcontrollers from stackswift ios 无法从堆栈中删除旧的模态视图控制器
【发布时间】:2015-10-28 16:08:13
【问题描述】:

在我的应用中,当用户登录时,我将帐户页面设置为新的根 VC。

看起来像这样:

导航控制器 -> 表格视图 -> menu(modal segue) -> 登录屏幕(modal segue) -> 帐户页面

当从登录转换到我正在使用的帐户时:

let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())

let vc = storyboard.instantiateViewControllerWithIdentifier("testVc")

let navigationController = self.view.window?.rootViewController as! UINavigationController
navigationController.setViewControllers([vc], animated: true)

这使帐户页面成为新的根 VC。但唯一的问题是一旦显示菜单和登录表单仍然在屏幕上可见。

那么如何清除显示为模态的两个旧 VC?

更新使它可以使用:

  @IBAction func loginButtonDidTouch(sender: AnyObject) {

        let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

        let vc = storyboard.instantiateViewControllerWithIdentifier("testVc")

        let navigationController = self.view.window?.rootViewController as! UINavigationController

        self.presentingViewController!.presentingViewController!.dismissViewControllerAnimated(false) { () -> Void in

        navigationController.setViewControllers([vc], animated: true)

        }

    }

但我不知道这样做是否正确?

【问题讨论】:

    标签: ios swift viewcontroller


    【解决方案1】:

    您需要获取这些控制器的引用,然后解除它们。

    试试这个:

    let loginScreen = self.window.rootViewController.presentedViewController
    
    loginScreen.dismissViewControllerAnimated(false) { () -> Void in
        let menuScreen = self.window.rootViewController.presentedViewController
        menuScreen.dismissViewControllerAnimated(false, completion: nil)
    }
    

    【讨论】:

    • 我是否也应该将自己的代码放入该块中?一旦你按下“登录”按钮,它就会被触发
    • 我不确定,试试看
    • 它不起作用。甚至没有删除两个模态 VC
    • 我现在几乎可以正常工作了,请查看我更新的问题。现在唯一的问题是删除模态VC时有延迟
    【解决方案2】:

    当您调用原始导航堆栈并对其进行修改时:

    let navigationController = self.view.window?.rootViewController as! UINavigationController
    

    您正在通过替换该导航堆栈中唯一的其他视图控制器“tableview”来设置新的视图控制器 (#testVc)。

    模态显示的视图不是该特定导航堆栈的一部分,而是作为 new 堆栈显示在当前导航堆栈的上方(这为您提供了指向顶部的新导航控制器以self.navigationController 的形式推送新视图)

    您可以通过在每个视图上调用 dismissViewControllerAnimated(_:completion:) 来显式关闭两个模态呈现的视图,很可能是通过委托响应或完成处理程序传播通信。

    【讨论】:

    • 现在它的工作方式如下:一旦您按下登录按钮,您就会被带到帐户屏幕。那么你有一个关于如何删除两个旧的模态 VC 的例子吗?
    • 我更新了我的代码,因为我现在几乎可以使用它了,请看一下。现在的问题是删除模态VC时有延迟
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2016-12-11
    • 2017-09-10
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多