作为练习,我不想使用导航控制器。
我有以下项目:
2个推送选择由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填充,内存使用量一直在上升,并且从未下降。我正在研究的项目有几个ViewController,它们可以随机调用其他任何一个。出于这个原因,我没有成功使用
UIViewController.dismiss(animated:completion:)
,因为它系统地使其返回到先前的ViewController。执行完搜索后,如何确定删除前一个ViewController?
最佳答案
根据注释,您不需要传统的“导航控制器”功能-主要是,您不需要“返回”按钮。
因此,一种选择是使用子视图控制器。
您的“主”视图控制器将只有一个“容器”视图。启动时,您将第一个VC加载为子VC,并将其视图添加为容器的子视图。当您要“导航”到任何其他VC时,将该VC作为子VC加载,用新的ChildVC的视图替换容器中的当前视图,然后卸载当前的子VC。
关于ios - 执行完序列后如何删除UIViewController?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57825036/