Как я могу переключить Bool, анимированный в Swift (в методе переопределения viewWillAppear)

#ios #swift #firebase-authentication #uikit

#iOS #быстрый #firebase-аутентификация #уикит

Вопрос:

Я хочу представить одну раскадровку после загрузки приложения, если пользователь вошел в систему, и другую, если пользователь должен войти в систему.

Я сделал это, перезаписав метод V iewWillAppear , который теперь содержит код, который перенаправляется на другую раскадровку при входе пользователя в систему.

 override func viewWillAppear(_ animated: Bool) {
        
        let userdefaults = UserDefaults.standard
        if userdefaults.string(forKey: "autoemail") != nil {
            let email = userdefaults.string(forKey: "autoemail")
            let password = userdefaults.string(forKey: "autopass")
            Auth.auth().signIn(withEmail: email!, password: password!) { (user, error) in
                self.performSegue(withIdentifier: "SignInSeguettt", sender: nil)
            }
        }
    }override func viewWillAppear(_ animated: Bool) {
        
        let userdefaults = UserDefaults.standard
        if userdefaults.string(forKey: "autoemail") != nil {
            let email = userdefaults.string(forKey: "autoemail")
            let password = userdefaults.string(forKey: "autopass")
            Auth.auth().signIn(withEmail: email!, password: password!) { (user, error) in
                self.performSegue(withIdentifier: "SignInSeguettt", sender: nil)
            }
        }
    }
 

Но теперь экран, который в противном случае появился бы на секунду, все равно появляется. Как я могу избежать этого? Я подумал, может быть, установив значение animated равным false. Я не знаю, как я могу это сделать, потому что, если я делаю это так, я получаю эту ошибку:

Метод не переопределяет какой-либо метод из своего суперкласса

Существуют ли другие способы обойти это кратковременное появление неправильного контроллера?

Ответ №1:

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

Способ определения того, разрешить ли пользователю перейти в приложение или, если они не вошли в систему, отобразить экран входа в систему, выполняется в классе SceneDelegate.swift (или может быть выполнено в классе AppDelegate, если в вашем приложении нет SceneDelegate)

Это делается так:

 class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    override init() {
        FirebaseApp.configure() // Configure Firebase
    }
    
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        var vc: UIViewController // Create a viewcontroller ready to return as the viewcontroller we are going to show to the user

        if (Auth.auth().currentUser) != nil { // The users' auth token is still good, they are logged in
            let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) // get a storyboard reference
            
            // Make our holding view controller an instance of the Main storyboard's initial view controller
            vc = mainStoryboard.instantiateInitialViewController()! 
            
        } else { // the user is not logged in
            // Has the user seen the onboarding screen before?
            if Session.HasShownOnboarding { // Yes has seen the onboardinng screens
                let mainStoryboard = UIStoryboard(name: "Account", bundle: nil) // get reference to the Account storyboard
                
                // Make our holding view controller an instance of the Account storyboard's Log In view controller
                vc = mainStoryboard.instantiateViewController(identifier: "LoginViewController")

            } else { // No the user has not been shown the onboarding screens yet
                let launchStoryboard = UIStoryboard(name: "Onboarding", bundle: nil) // get reference to the Onboarding storyboard
                
                // Make our holding view controller an instance of the Onboading storyboard's Onboarding view controller
                vc = launchStoryboard.instantiateViewController(identifier: "OnboardingViewController")
                Session.HasShownOnboarding = true
            }
        }

        // Make the app's default view controller to display, whatever we set from the logic above, either Main, or Login, or Onboarding
        self.window?.rootViewController = vc
    }


// ...

}
 

Комментарии:

1. Привет, @latenitecoder Спасибо, это отлично работает! У меня есть другой вопрос: как я могу переключиться, если нажата кнопка, на файл раскадровки? Я имею в виду, я знаю, как вы можете переключать раскадровки в одном файле с помощью переходов, но как я могу сделать это с разными файлами? Спасибо Boothosh

2. Вы просто выполняете описанные выше шаги для сеанса. HasShownOnboarding в вашем @IBAction присвоил имя раскадровке. Если это начальный контроллер представления, вы можете использовать yourStoryboard.instantiateInitialViewController если он находится в раскадровке, но не в первом показанном представлении, используйте youStoryboard.Идентификатор instantiateViewController Имя вашего ViewController