执行 segue 后如何删除 UIViewController?

Posted

技术标签:

【中文标题】执行 segue 后如何删除 UIViewController?【英文标题】:How to remove a UIViewController after having performed a segue? 【发布时间】: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?

【问题讨论】:

Possibly unwind segues @shim 是的,它适用于 2 个视图控制器,但正如我所说,我的项目有几个,它们可以按任何顺序调用任何其他视图控制器,这会阻止使用展开 为什么不想使用导航控制器? 与其在前一个视图控制器上显示后续视图控制器,不如先将它们关闭,然后在某个基本视图控制器上显示新视图控制器? 听起来你在尝试重新发明***;这就是UINavigationController 的用途。 【参考方案1】:

基于 cmets,您不需要传统的“导航控制器”功能 - 主要是,您不需要“返回”按钮。

因此,一种选择是使用子视图控制器。

您的“主”视图控制器将只有一个“容器”视图。启动时,您将第一个 VC 作为子 VC 加载,并将其视图添加为容器的子视图。当您想“导航”到任何其他 VC 时,将该 VC 作为子 VC 加载,将容器中的当前视图替换为新的 ChildVC 的视图,然后卸载当前的子 VC。

【讨论】:

我在this article 之后尝试了您的解决方案,效果很好!这是超级干净和快速。

以上是关于执行 segue 后如何删除 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

将 segued 数据存储在单独的视图控制器上(swift 4)

在 Xcode 中执行 segue 后如何关闭视图控制器?

如何在swift3中完成5个文件下载请求后执行segue

单击TableView部分中的任意位置后如何执行segue?

如何延迟执行 Segue

在授予通知访问权限后执行 segue