Swift iOS -View Controller deinit 在将其添加到新的 keyWindow 时运行



我有一个视图控制器(OrangeVC(,我将其添加到包含新keyWindow(NewKeyWindowClass(的类中。点击不同 vc 中的按钮,它会触发这个新窗口显示在应用程序的主窗口上,并从屏幕的右侧底部动画填充到顶部。动画工作正常,它从底部开始,用橙色背景的新 vc 填充屏幕。问题是,一旦OrangeVC被添加到NewKeyWindowClass中,orangeVC的deinit就会不断被触发。

为什么它要运行?

动画师类内部的类:

class OrangeController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .orange
}
deinit {
print("OrangeVC -Deinit")
}
}

动画师类:

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,创建一个并设置 keyWindow.rootViewController 属性。然后展示您的 从中查看控制器。或者只是根视图控制器是你的 实际上是视图控制器。

RedVC之所以继续运行,是因为keyWindow没有rootViewController。我将RedVC的视图作为子视图添加到keyWindowkeyWindow.addSubview(orangeVC.view),而不是使其成为rootVC:

keyWindow.rootViewController = redVC

一旦我添加了它,当动画发生时,RedVC 的 deinit 不再运行。

应该注意的是,虽然它阻止了deinit运行,但我丢失了动画,它也使原始的keyWindow消失了。我实际上应该将其添加到不同的UIWindow中。

相关内容

  • 没有找到相关文章

最新更新