Представление ViewController из подкласса UIApplication - PullRequest
0 голосов
/ 30 апреля 2018

В моем подклассе UIApplication работает таймер, который должен отправить пользователя определенному ViewController, когда он закончится.

Я могу создать экземпляр ViewController, к которому я хочу пойти ...

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "StartVC")

... но я не знаю, как на самом деле представить его. Внутри AppDelegate Я мог бы сделать window.rootViewController и т. Д. Но это недоступно в моем подклассе UIApplication.

Я также пытался self.windows[0].rootViewController, но это всегда только первый ViewController, который присутствовал при запуске приложения. То же самое с self.keyWindow.rootViewController. И я, честно говоря, не знаю, каковы оба этих свойства.

Полный код для контекста:

import Foundation
import UIKit

class MyApplication: UIApplication {

    var inactivityTimer: Timer!

    override init() {
        super.init()
        restartInactivityTimer()
    }

    @objc func timerExceeded() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "StartVC")
        //...here I would need to present "vc"
    }

    override func sendEvent(_ event: UIEvent) {
        super.sendEvent(event)
        restartInactivityTimer()
    }

    func restartInactivityTimer() {
        if inactivityTimer != nil { inactivityTimer.invalidate() }
        inactivityTimer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(timerExceeded), userInfo: nil, repeats: false)
    }
}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Я сам решил это так:

//inside my UIApplication subclass
@objc func timerExceeded() {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: "StartVC") as! StartVC
    self.windows.first?.rootViewController = vc
    self.windows.first?.makeKeyAndVisible()
}
0 голосов
/ 30 апреля 2018

Реализация таймера неактивности не требует создания подкласса UIApplication. Согласно примечаниям по подклассам из документации UIApplication , подклассы должны быть необходимы только в очень редких случаях:

Большинству приложений не нужно создавать подклассы UIApplication. Вместо этого используйте делегат приложения для управления взаимодействиями между системой и приложением.

Если ваше приложение должно обрабатывать входящие события до того, как это сделает система - очень редкая ситуация, - вы можете реализовать специальный механизм диспетчеризации событий или действий. Для этого создайте подкласс UIApplication и переопределите методы sendEvent ( :) и / или sendAction (: to: from: for :). Для каждого перехваченного события отправьте его обратно в систему, вызвав [super sendEvent: event] после обработки события. Перехват событий требуется только в редких случаях, и вам следует избегать его, если это возможно.

Как вы уже упоминали в своем вопросе, вы можете получить доступ ко всему, что вам нужно, из / через AppDelegate. Итак, почему бы не обработать таймаут неактивности в / через AppDelegate?

...