从内存中删除所有先前加载的 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
所以目前内存中有 ViewController
和 SecondViewController
。
现在,当您单击 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)
}
所以现在内存中有 ViewController
和 ThirdViewController
。
SecondViewController
已从内存中删除。
更好的解决方案是将您的控制器保持在 UINavigationController
堆栈中,因为您可以获得所有 ViewControllers
压入堆栈的数组。
我目前正在编辑以前编写的代码, 在应用程序中,第一个 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
所以目前内存中有 ViewController
和 SecondViewController
。
现在,当您单击 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)
}
所以现在内存中有 ViewController
和 ThirdViewController
。
SecondViewController
已从内存中删除。
更好的解决方案是将您的控制器保持在 UINavigationController
堆栈中,因为您可以获得所有 ViewControllers
压入堆栈的数组。