【发布时间】:2019-09-06 15:42:18
【问题描述】:
作为一个练习,我不想使用导航控制器。
我有以下项目:
2 个 push segues 由 ViewControllers 中心的每个按钮触发。他们使用以下自定义类:
class CustomSegue: UIStoryboardSegue {
override func perform() {
weak var firstView = self.source.view as UIView?
weak var secondView = self.destination.view as UIView?
let screenSize = UIScreen.main.bounds.size
secondView?.frame = CGRect(x: screenSize.width, y: 0.0, width: screenSize.width, height: screenSize.height)
UIApplication.shared.keyWindow?.insertSubview(secondView!, aboveSubview: firstView!)
UIView.animate(withDuration: 0.3, animations: { () -> Void in
firstView!.frame = firstView!.frame.offsetBy(dx: -1 * screenSize.width, dy: 0.0)
secondView!.frame = secondView!.frame.offsetBy(dx: -1 * screenSize.width, dy: 0.0)
}) { (_) -> Void in
self.source.present(self.destination, animated: false, completion: nil)
}
}
}
这非常错误,因为它在每次执行 segue 时都会创建一个新的 ViewController 对象。由于UIApplication.shared.keyWindow.subviews 被 UIViews 填满,内存使用量一直在上升,而且从未下降...
我正在处理的项目有几个 ViewControllers 可以随机调用任何其他的。由于这个原因,我没有成功使用UIViewController.dismiss(animated:completion:),因为它系统地使它回到了之前的 ViewController。
在执行 segue 之后,我怎样才能确定删除以前的 ViewController?
【问题讨论】:
-
@shim 是的,它适用于 2 个视图控制器,但正如我所说,我的项目有几个,它们可以按任何顺序调用任何其他视图控制器,这会阻止使用展开
-
为什么不想使用导航控制器?
-
与其在前一个视图控制器上显示后续视图控制器,不如先将它们关闭,然后在某个基本视图控制器上显示新视图控制器?
-
听起来你在尝试重新发明轮子;这就是
UINavigationController的用途。
标签: ios swift memory-leaks uiviewcontroller segue