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

Removing all previously loaded ViewControllers from memory iOS Swift

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

应用程序显然使用了大量内存。

关闭视图控制器不是一个选项。

如果我在堆栈中一个接一个地弹出视图控制器,这是行不通的,每个视图都有弹出窗口等显示在 viewdidAppear 上。

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

场景如下:

                         ListViewController 
                     /            |            \ 
             AViewController  BViewController  CViewController

列表ViewController 有 3 个元素

一个 乙 C

用户可以点击其中的任何一个,结果会显示 ViewController。 在每个视图控制器中,当按下后退按钮时,将显示列表ViewController。

使用以下代码呈现视图:

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

我不确定它是否有效。试试这个。在展示任何新的 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 按钮中 Press

@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 压入堆栈的数组。