Xcode и Swift - невозможно создать экземпляр другого контроллера представления из AppDelegate - PullRequest
0 голосов
/ 17 июня 2020

в этом приложении при первом использовании вы получаете 3 страницы приветствия. После последнего я сохраняю bool в true в UserDefaults, чтобы пропустить эти страницы приветствия в следующий раз, когда пользователь запустит приложение.

Для этого в AppDelegate.swift я делаю следующее:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        if UserDefaultsVault.shared.getDidFinishIntro() == true {

            self.window = UIWindow(frame: UIScreen.main.bounds)
            let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

            let mainVC = storyboard.instantiateViewController(withIdentifier: "mainPage") as UIViewController

            self.window?.rootViewController = mainVC
            self.window?.makeKeyAndVisible()

        } 

        return true
    }

Я, конечно, добавил идентификатор раскадровки к моему контроллеру представления в раскадровке, и я также проверил с помощью точки останова, выполняется ли условие (и это правда).

Несмотря на это, главный контроллер не создает экземпляр.

Я сделал другое приложение с этим кодом, и оно всегда работало!

Я что-то ошибся?

1 Ответ

2 голосов
/ 17 июня 2020

Для iOS 13+ вам нужно указать instantiateViewController(withIdentifier:) в SceneDelegate, например:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = scene as? UIWindowScene else { return }
        window = UIWindow(windowScene: windowScene)
        window?.makeKeyAndVisible()

        if UserDefaultsVault.shared.getDidFinishIntro() {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            window?.rootViewController = storyboard.instantiateViewController(withIdentifier: "mainPage")
        }
    }
}

Примечание: ваш код будет работать для устройств, использующих iOS 13 ниже.

...