Swift iOS - View Controller deinit 在将其添加到新的 keyWindow 时运行
Swift iOS -View Controller deinit runs when adding it to a new keyWindow
我有一个视图控制器 (OrangeVC),我将其添加到 class,其中包含一个新的 keyWindow(NewKeyWindowClass)。点击另一个 vc 中的按钮,它会触发这个新的 window 显示在应用程序的主 window 上,它从屏幕的右侧底部开始动画以填充到顶部.动画效果很好,它从底部开始,用橙色背景的新 vc 填充屏幕。问题是一旦将 OrangeVC 添加到 NewKeyWindowClass,orangeVC 的 deinit 就会不断被触发。
为什么它是 deinit 运行?
Class 进入 Animator Class:
class OrangeController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .orange
}
deinit {
print("OrangeVC -Deinit")
}
}
动画师Class:
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
})
}
}
触发动画的另一个 class 按钮:
@IBAction func triggerAnimationButtonPressed(_ sender: UIButton) {
let newKeyWindowClass = NewKeyWindowClass()
newKeyWindowClass.animateOrangeVCFromBottomToTop()
}
那里得到了答案
An iOS application must have a rootViewController, create one and set
the keyWindow.rootViewController property to it. Then present your
view controller from that. Or just the rootViewController to be your
View Controller actually.
RedVC 保持 运行 取消初始化的原因是因为 keyWindow 没有 rootViewController。我将 RedVC 的视图作为子视图添加到 keyWindow keyWindow.addSubview(orangeVC.view)
而不是使其成为 rootVC:
keyWindow.rootViewController = redVC
一旦我添加它,当动画发生时 RedVC 的 deinit 不再 运行。
需要注意的是,虽然它阻止了deinit from 运行 我失去了动画,它也让原来的keyWindow消失了。我实际上应该将它添加到不同的 UIWindow。
我有一个视图控制器 (OrangeVC),我将其添加到 class,其中包含一个新的 keyWindow(NewKeyWindowClass)。点击另一个 vc 中的按钮,它会触发这个新的 window 显示在应用程序的主 window 上,它从屏幕的右侧底部开始动画以填充到顶部.动画效果很好,它从底部开始,用橙色背景的新 vc 填充屏幕。问题是一旦将 OrangeVC 添加到 NewKeyWindowClass,orangeVC 的 deinit 就会不断被触发。
为什么它是 deinit 运行?
Class 进入 Animator Class:
class OrangeController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .orange
}
deinit {
print("OrangeVC -Deinit")
}
}
动画师Class:
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
})
}
}
触发动画的另一个 class 按钮:
@IBAction func triggerAnimationButtonPressed(_ sender: UIButton) {
let newKeyWindowClass = NewKeyWindowClass()
newKeyWindowClass.animateOrangeVCFromBottomToTop()
}
An iOS application must have a rootViewController, create one and set the keyWindow.rootViewController property to it. Then present your view controller from that. Or just the rootViewController to be your View Controller actually.
RedVC 保持 运行 取消初始化的原因是因为 keyWindow 没有 rootViewController。我将 RedVC 的视图作为子视图添加到 keyWindow keyWindow.addSubview(orangeVC.view)
而不是使其成为 rootVC:
keyWindow.rootViewController = redVC
一旦我添加它,当动画发生时 RedVC 的 deinit 不再 运行。
需要注意的是,虽然它阻止了deinit from 运行 我失去了动画,它也让原来的keyWindow消失了。我实际上应该将它添加到不同的 UIWindow。