提问人:Lance Samaria 提问时间:6/26/2018 更新时间:6/26/2018 访问量:199
Swift iOS -View Controller deinit 在将其添加到新 keyWindow 时运行
Swift iOS -View Controller deinit runs when adding it to a new keyWindow
问:
我有一个视图控制器(OrangeVC),我将其添加到一个包含新keyWindow(NewKeyWindowClass)的类中。点击不同 vc 中的按钮,它会触发这个新窗口显示在应用程序的主窗口上,并从屏幕的右侧底部进行动画处理以填充到顶部。动画效果很好,它从底部开始,用一个橙色背景的新 vc 填充屏幕。问题是,一旦将 OrangeVC 添加到 NewKeyWindowClass 中,orangeVC 的 deinit 就会不断被触发。
为什么它在运行?
进入 Animator 类的类:
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()
}
答:
0赞
Lance Samaria
6/26/2018
#1
我从这个reddit上得到了答案
iOS 应用程序必须具有 rootViewController,创建一个并将 keyWindow.rootViewController 属性。然后展示你的 从中查看控制器。或者只是 rootViewController 作为你的 实际上,视图控制器。
RedVC 继续运行它的 deinit 的原因是 keyWindow 没有 rootViewController。我将 RedVC 的视图作为子视图添加到 keyWindow 中,而不是使其成为 rootVC:keyWindow.addSubview(orangeVC.view)
keyWindow.rootViewController = redVC
一旦我添加了它,RedVC 的 deinit 在动画发生时不再运行。
需要注意的是,虽然它阻止了 deinit 的运行,但我丢失了动画,并且还使原始的 keyWindow 消失了。我实际上应该将其添加到不同的 UIWindow 中。
评论