作为练习,我不想使用导航控制器。
我有以下项目:
ios - 执行完序列后如何删除UIViewController?-LMLPHP
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/

10-12 03:37
查看更多