Swift iOS - добавление второго UIWindow не появляется

У меня есть второй UIWindow, который я добавляю в свое приложение. Когда я добавляю его, окно ненадолго появляется, а затем внезапно исчезает. Он может показываться на десятую долю секунды, а потом пуф, его нет. Где я ошибаюсь?

class AddSecondWindowClass: NSObject {

    let redVC = RedController()
    var window: UIWindow?

    func showSecondWindow() {

        let navVC = UINavigationController(rootViewController: redVC)
        navVC.navigationBar.isHidden = true
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.backgroundColor = .white
        window?.windowLevel = UIWindowLevelStatusBar
        window?.rootViewController = navVC
        window?.isHidden = false
        window?.makeKeyAndVisible()
    }
}

class RedController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .red
    }

    deinit {
        print("RedVC -DEINIT")
    }
}

Другой класс с кнопкой, которая показывает окно

@IBAction func triggerSecondWindowButton(_ sender: UIButton) {
    let addSecondWindowClass = AddSecondWindowClass()
    addSecondWindowClass.showSecondWindow()
}

person Lance Samaria    schedule 26.06.2018    source источник


Ответы (1)


Проблема в том, что вы не храните объект AddSecondWindowClass.

Вы создаете переменную в методе triggerSecondWindowButton(sender:), но как только функция завершается, addSecondWindowClass больше не имеет на нее ссылок и вскоре уничтожается. Когда этот объект уничтожается, добавленное вами окно больше не имеет ссылок, поэтому также уничтожается.

Чтобы решить эту проблему, вам просто нужно сохранить ссылку на AddSecondWindowClass где-нибудь, она будет храниться до тех пор, пока вы хотите, чтобы окно было видимым. (Возможно, как свойство или ивар в классе triggerSecondWindowButton(sender:)).

person Jsdodgers    schedule 26.06.2018
comment
Вы правите! Спасибо большое ???????????? - person Lance Samaria; 26.06.2018
comment
быстрый вопрос, я собираюсь добавить анимацию в AddSecondWindowClass и в конечном итоге отклонить ее. Будет ли добавление этого свойства каким-то образом вызывать цикл сохранения? Должен ли я объявить его слабым? слабая переменная addSecondWindowClass: AddSecondWindowClass? а затем инициализируйте его в viewDidLoad - person Lance Samaria; 26.06.2018
comment
теперь, когда я думаю о том, что они не ссылаются друг на друга, поэтому они не должны - person Lance Samaria; 26.06.2018
comment
Если вы объявите его слабым, он не будет сохранен, и у вас будет та же проблема, что и раньше. Однако если AddSecondWindowClass имеет ссылку на объект, который его создал, эта ссылка должна быть слабой, чтобы избежать цикла сохранения. - person Jsdodgers; 26.06.2018
comment
Да, в AddSecondWidndowClass нет ссылки на класс с кнопкой. Спасибо за информацию и приятного вечера - person Lance Samaria; 26.06.2018