0

我有一个视图控制器 (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")
    }
}

动画师类:

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()
}
4

1 回答 1

0

我从这个 reddit得到了答案

iOS 应用程序必须有一个 rootViewController,创建一个并将 keyWindow.rootViewController 属性设置为它。然后从中展示您的视图控制器。或者只是 rootViewController 实际上是您的视图控制器。

RedVC 一直运行它的 deinit 的原因是因为 keyWindow 没有 rootViewController。我将 RedVC 的视图作为子视图添加到 keyWindow,keyWindow.addSubview(orangeVC.view)而不是使其成为 rootVC:

keyWindow.rootViewController = redVC

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

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

于 2018-06-25T20:12:02.413 回答