Как обеспечить поддержку iOS 12 при разработке приложения в iOS 13? - PullRequest
0 голосов
/ 27 января 2020

У меня есть несколько вопросов. Я разрабатываю приложение в Xcode 11.3 и Swift 5. Приложение включает в себя SceneDelegate класс. Я написал весь код, связанный с пользовательским интерфейсом в SceneDelegate классе. Например:

if (login) {
    self.goToDashboardView()
} else {
    self.goToSignInView()
}

func goToSignInView() {

    let signInVC = ACStoryboard.SignIn.getViewController(identifier: "SignInViewController") as! SignInViewController
    let nav = UINavigationController(rootViewController: signInVC)
    self.window?.rootViewController = nav
}

func goToDashboardView() {

    let tabBarVC = ACStoryboard.Dashboard.getViewController(identifier: "ACBottomMenuController") as! ACBottomMenuController
    self.tabBarVC = tabBarVC
    self.window?.rootViewController = tabBarVC
}

Я также должен добавить поддержку устройств iOS 11 and 12. В iOS 12 нет SceneDelegate. Я пометил SceneDelegate класс как @available(iOS 13, *). Поэтому нет смысла писать код выше в SceneDelegate, поскольку я не могу использовать его в iOS 12.

  1. Какое альтернативное решение для этого. Где я должен написать свой код?

Я вызывал goToSignInView() и goToDashboardView() методы из всех приложений, когда это было необходимо. Вот мой код:

let mySceneDelegate = self.view.window?.windowScene?.delegate as! SceneDelegate
mySceneDelegate.goToSignInView()

В iOS 12 этот код также не будет работать. Поэтому я делаю так:

if #available(iOS 13, *) {
    let mySceneDelegate = self.view.window?.windowScene?.delegate as! SceneDelegate
    mySceneDelegate.goToSignInView()
} else {
    let appDelegate = UIApplication.shared.delegate as? AppDelegate
    let signInVC = ACStoryboard.SignIn.getViewController(identifier: "SignInViewController") as! SignInViewController
    let nav = UINavigationController(rootViewController: signInVC)
    appDelegate?.window?.rootViewController = nav
}

Это означает, что я должен объявить переменную window в AppDelegate, хотя она доступна в SceneDelegate. Это нехорошая практика, и другое дело, я нахожу приведенный выше код везде в приложении, где это необходимо, слишком смешно.

Какое лучшее решение для этого?

Как я могу получить SceneDelegate экземпляр?

Короче, в моем случае SceneDelegate совершенно бесполезен. Но я не хочу его удалять. Как это будет полезно в будущих обновлениях / устаревших. Я хочу знать, как преодолеть все вышеперечисленные проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...