繁体   English   中英

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

[英]Swift iOS -View Controller deinit runs when adding it to a new keyWindow

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

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

我从这个reddit中得到了答案

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

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

keyWindow.rootViewController = redVC

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

应该注意的是,尽管它停止了deinit的运行,但我丢失了动画,并且还使原始的keyWindow消失了。 我实际上应该将此添加到其他UIWindow中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM