#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