gpt4 book ai didi

ios - 更改 rootViewController 时保留另一个 View Controller

转载 作者:行者123 更新时间:2023-11-29 00:07:00 26 4
gpt4 key购买 nike

我在执行以下操作的应用程序中发现内存泄漏:

想象两个 View Controller ,每个 View Controller 都调用 appDelegate 中的一个函数,与此类似:

func switchRootViewController() {    
let vc = getTheOtherViewController()
self.window?.rootViewController = vc
}

到目前为止,它运行良好 - 显示了另一个 VC,并释放了调用该函数的那个​​。

但是当您通过以下方式从第一个或第二个 VC 呈现第三个 View Controller 时:呈现(ThirdViewController(),动画:true)

然后从 ThirdVC 调用 appDelegate 中的上述函数(通过使它成为 rootViewController 来显示一两个 viewController),这个 ThirdVC 和呈现它的 VC 不会被释放。

知道这是为什么吗?

如果需要,可以发布示例项目。如果有什么不同的话,VC 是从 Storyboard实例化的。

最佳答案

你在这里弄乱了 View 层次结构。在切换到新 View Controller 之前,您应该关闭当前 rootViewController 的所有呈现的 View Controller 。这是我发现的唯一可行的解​​决方案!

您的switchRootViewController 方法应该如下所示,

func switchRootViewController() {    
if var topController = UIApplication.shared.keyWindow?.rootViewController {
while let presentedViewController = topController.presentedViewController {
topController = presentedViewController
}
topController.dismiss(animated: true, completion: {
let vc = getTheOtherViewController()
self.window?.rootViewController = vc
})
}
}

如果你有多个 View Controller ,

func switchRootViewController() {   
self.view.window!.rootViewController?.dismiss(animated: true, completion: {
let vc = getTheOtherViewController()
self.window?.rootViewController = vc
})
}

关于ios - 更改 rootViewController 时保留另一个 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47746068/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com