从内存iOS Swift中删除所有以前加载的ViewControllers

时间:2016-10-18 06:05:11

标签: ios swift uiviewcontroller presentviewcontroller

我正在编辑之前编写的代码, 在应用程序中,第一个viewController是一个名为:ListViewController的表视图控制器,它有几个元素,每个行选择都会创建一个视图控制器的新实例并以模态方式呈现它。但是在那些视图控制器中,前一个开发人员再次创建ListViewController的实例并以模态方式呈现它而不是解雇它们。

该应用程序显然正在使用大量内存。

解雇视图控制器不是一种选择。

如果我逐个弹出堆栈中的视图控制器,这不起作用,每个视图都有viewdidAppear上显示的弹出窗口等。

我需要从内存中删除所有以前加载的ViewControllers并提供一个viewController,以便内存中没有任何ViewControllers的实例。 可能吗? 有没有办法我可以说一个名为HomeViewController的新ViewController确保释放所有以前加载的所有视图控制器的实例。

方案如下:

                         ListViewController 
                     /            |            \ 
             AViewController  BViewController  CViewController

ListViewController有3个元素

一个 乙 ç

用户可以点击其中任何一个,这会导致呈现ViewController。 从每个视图控制器中,当按下后退按钮时,将显示ListViewController。

使用以下代码显示视图:

if let listViewController = storyboard!.instantiateViewControllerWithIdentifier("ListViewController") as? ListViewController {
                    self.presentViewController(listViewController, animated: true, completion: nil)
                }

1 个答案:

答案 0 :(得分:1)

我不确定它会起作用。试试这个。在提出任何新ViewController之前。

AppDelegate

中制作方法
func switchControllers(viewControllerToBeDismissed:UIViewController,controllerToBePresented:UIViewController) {
        if (viewControllerToBeDismissed.isViewLoaded && (viewControllerToBeDismissed.view.window != nil)) {
            // viewControllerToBeDismissed is visible
            //First dismiss and then load your new presented controller
            viewControllerToBeDismissed.dismiss(animated: false, completion: {
                self.window?.rootViewController?.present(controllerToBePresented, animated: true, completion: nil)
            })
        } else {
        }
    }

现在让我们说你像这样移动

ViewController - >您单击按钮并显示SecondViewController

目前我们在内存中有ViewControllerSecondViewController

现在当您点击SecondViewController中的某个按钮以显示ThirdViewController时,SecondViewController必须解除。所以在SecondViewController按钮按

@IBAction func buttonPress(_ sender: AnyObject) {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    let controllerToBePresented = self.storyboard?.instantiateViewController(withIdentifier: "ThirdViewController") as! ThirdViewController
    appDelegate.switchControllers(viewControllerToBeDismissed: self, controllerToBePresented: controllerToBePresented)
}

现在我们在记忆中有ViewControllerThirdViewController SecondViewController已从内存中删除。

更好的解决方案是将控制器保持在UINavigationController堆栈中,因为你可以在堆栈上获得所有ViewControllers的数组。