问候StackOverflow!
我是Swift开发的新手,所以请不要对我发疯:3
我已经为我的移动应用程序创建了一个登录页面(Firebase电子邮件+密码)
我已经实现了一个“自动登录”功能--所以当用户第一次登录时,用户在关闭和打开应用程序后仍保持登录状态。
问题是,每次用户打开应用程序时,viewDidLoad和viewDidAppear ->之间都会有轻微的延迟,导致每次打开应用程序时,您都会看到大约0.4秒的登录屏幕,直到它自动让用户登录。
一旦用户登录,该用户就会连接到我的UITabBarController (无动画)。
我已经提供了我的LoginViewController的代码。
LoginViewController是我加载应用程序的第一个控制器。
诚挚的问候
class LoginViewController: UIViewController {
@IBOutlet weak var loginEmail: UITextField!
@IBOutlet weak var loginPassword: UITextField!
@IBOutlet weak var loginBorder: UIButton!
let userDefault = UserDefaults.standard
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(_ animated: Bool) {
if userDefault.bool(forKey: "usersignedin") {
performSegue(withIdentifier: "login", sender: self)
}
//Border color button//
loginBorder.layer.borderColor = UIColor.white.cgColor
//Border color button//
//Hide Keyboard Use
self.hideKeyboardWhenTappedAround()
//Hide Keyboard Use
//start padding function for login
addPaddingAndBorder(to: loginEmail)
addPaddingAndBorder(to: loginPassword)
//start padding function for login
}
@IBAction func loginButton(_ sender: UIButton) {
Auth.auth().signIn(withEmail: loginEmail.text!, password: loginPassword.text!) { (user, error) in
if user != nil {
self.userDefault.set(true, forKey: "usersignedin")
self.userDefault.synchronize()
self.performSegue(withIdentifier: "login", sender: self)
} else {
let alert = UIAlertController(title: "Invalid Email or Password", message: nil, preferredStyle: .alert)
let okButton = UIAlertAction(title: "Ok", style: .default, handler: nil)
alert.addAction(okButton)
self.present(alert, animated: true, completion: nil)
}
}
}
}发布于 2019-06-12 18:15:34
在我当前的项目中,我们正在做类似的事情,但是我们决定在AppDelegate中首先显示哪个控制器。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
var storyboard: UIStoryboard!
if isLoggedIn {
storyboard = UIStoryboard(name: "main", bundle: nil)
}
else {
storyboard = UIStoryboard(name: "login", bundle: nil)
}
let viewController = storyboard.instantiateInitialViewController()!
viewController.loadViewIfNeeded()
window.rootViewController = viewController
}这样做的好处是,当应用程序加载时,它会立即将您带到正确的ViewController,而不会先短暂地显示错误的one。
发布于 2019-06-12 17:35:26
将对performSegue(withIdentifier:sender:)的调用移动到viewWillAppear(_:),而不是case usersignedin = true中的viewDidAppear(_:)。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if userDefault.bool(forKey: "usersignedin") {
performSegue(withIdentifier: "login", sender: self)
}
}另外,在main thread上没有接收到signIn方法的响应。由于您没有更新main thread上的UI,这就是它导致延迟的原因。
在DispatchQueue.main.async中嵌入UI方法的closure中的signIn部件
Auth.auth().signIn(withEmail: loginEmail.text!, password: loginPassword.text!) { (user, error) in
if user != nil {
self.userDefault.set(true, forKey: "usersignedin")
self.userDefault.synchronize()
DispatchQueue.main.async { //here..........
self.performSegue(withIdentifier: "login", sender: self)
}
}
else {
let alert = UIAlertController(title: "Invalid Email or Password", message: nil, preferredStyle: .alert)
let okButton = UIAlertAction(title: "Ok", style: .default, handler: nil)
alert.addAction(okButton)
DispatchQueue.main.async { //here..........
self.present(alert, animated: true, completion: nil)
}
}
}发布于 2019-06-12 17:35:57
这是正确的系统行为。调用ViewDidLoad总是比调用ViewDidAppear快得多。如果您想要更改基于userDefault.bool(forKey: "usersignedin")的基本视图控制器,请将该逻辑添加到设置主视图控制器的位置,并在已经登录的情况下交换它们。
https://stackoverflow.com/questions/56558929
复制相似问题