Swin iOS-View Controller deinit запускается при добавлении его в новое keyWindow - PullRequest
0 голосов
/ 25 июня 2018

У меня есть контроллер представления (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 Ответ

0 голосов
/ 25 июня 2018

Я получил ответ от этого 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.

...