Swin iOS -View Controller deinit запускается при добавлении его в новое keyWindow
У меня есть контроллер представления (OrangeVC), который я добавляю в класс, который содержит новое keyWindow(NewKeyWindowClass). Нажатие кнопки в другом виртуальном канале приводит к появлению нового окна, которое отображается над главным окном приложения, и анимирует его в правой нижней части экрана, чтобы заполнить его до верха. Анимация работает нормально, она начинается снизу и заполняет экран новым vc с оранжевым фоном. Проблема в том, что после добавления OrangeVC в класс NewKeyWindowClass модуль deinit orangeVC продолжает срабатывать.
Почему работает deinit?
Класс, который входит в класс аниматора:
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()
}
1 ответ
Я получил ответ от этого Reddit
Приложение iOS должно иметь rootViewController, создать его и установить для него свойство keyWindow.rootViewController. Затем представьте свой контроллер вида из этого. Или просто rootViewController, чтобы быть вашим View Controller на самом деле.
Причина, по которой RedVC продолжал работать, заключалась в том, что у keyWindow не было rootViewController. Я добавил представление RedVC как подпредставление к keyWindow keyWindow.addSubview(orangeVC.view)
вместо того, чтобы сделать это, это rootVC:
keyWindow.rootViewController = redVC
Как только я добавил это, deinit RedVC больше не работал, когда произошла анимация.
Следует отметить, что, хотя он остановил запуск deinit, я потерял анимацию, и это также привело к исчезновению оригинального ключевого окна. Я должен добавить это в другое окно UIWindow.