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