[英]Swift iOS -Should Deinit get called inside child View Controller when added as a child to another View Controller?
[英]Swift iOS -View Controller deinit runs when adding it to a new keyWindow
我将视图控制器(OrangeVC)添加到包含新keyWindow(NewKeyWindowClass)的类中。 轻按另一个vc中的按钮,它会触发该新窗口以显示在应用程序的主窗口上,并且从屏幕的右下角到顶部进行动画处理。 动画效果很好,它从底部开始,并用橙色背景的新vc填充屏幕。 问题是,一旦将OrangeVC添加到NewKeyWindowClass,orangeVC的deinit就会不断被触发。
为什么要运行deinit?
Animator类中的类:
class OrangeController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .orange
}
deinit {
print("OrangeVC -Deinit")
}
}
AnimatorClass:
import UIKit
class NewKeyWindowClass: NSObject {
func animateOrangeVCFromBottomToTop() {
guard let keyWindow = UIApplication.shared.keyWindow else { return }
let orangeVC = OrangeController()
// 1. starting frame
orangeVC.view.frame = CGRect(x: keyWindow.frame.width - 10, y: keyWindow.frame.height - 10, width: 10, height: 10)
keyWindow.addSubview(orangeVC.view)
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
// 2. ending frame
orangeVC.view.frame = keyWindow.frame
})
}
}
来自另一个类的按钮触发动画:
@IBAction func triggerAnimationButtonPressed(_ sender: UIButton) {
let newKeyWindowClass = NewKeyWindowClass()
newKeyWindowClass.animateOrangeVCFromBottomToTop()
}
我从这个reddit中得到了答案
iOS应用程序必须具有rootViewController,创建一个rootViewController并将其设置为keyWindow.rootViewController属性。 然后从中显示您的视图控制器。 或者只是rootViewController实际上是您的View Controller。
RedVC保持运行的原因是deinit是因为keyWindow没有rootViewController。 我将RedVC的视图作为子视图添加到keyWindow keyWindow.addSubview(orangeVC.view)
而不是使其成为rootVC:
keyWindow.rootViewController = redVC
一旦添加它,动画发生时RedVC的deinit将不再运行。
应该注意的是,尽管它停止了deinit的运行,但我丢失了动画,并且还使原始的keyWindow消失了。 我实际上应该将此添加到其他UIWindow中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.