У меня есть несколько вопросов. Я разрабатываю приложение в 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
.
- Какое альтернативное решение для этого. Где я должен написать свой код?
Я вызывал 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
совершенно бесполезен. Но я не хочу его удалять. Как это будет полезно в будущих обновлениях / устаревших. Я хочу знать, как преодолеть все вышеперечисленные проблемы?