首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >viewDidAppear延迟0.5秒

viewDidAppear延迟0.5秒
EN

Stack Overflow用户
提问于 2019-06-12 17:31:44
回答 6查看 282关注 0票数 3

问候StackOverflow!

我是Swift开发的新手,所以请不要对我发疯:3

我已经为我的移动应用程序创建了一个登录页面(Firebase电子邮件+密码)

我已经实现了一个“自动登录”功能--所以当用户第一次登录时,用户在关闭和打开应用程序后仍保持登录状态。

问题是,每次用户打开应用程序时,viewDidLoadviewDidAppear ->之间都会有轻微的延迟,导致每次打开应用程序时,您都会看到大约0.4秒的登录屏幕,直到它自动让用户登录。

一旦用户登录,该用户就会连接到我的UITabBarController (无动画)。

我已经提供了我的LoginViewController的代码。

LoginViewController是我加载应用程序的第一个控制器。

诚挚的问候

代码语言:javascript
复制
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)              
            }
        }
    }
}
EN

回答 6

Stack Overflow用户

发布于 2019-06-12 18:15:34

在我当前的项目中,我们正在做类似的事情,但是我们决定在AppDelegate中首先显示哪个控制器。

代码语言:javascript
复制
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。

票数 4
EN

Stack Overflow用户

发布于 2019-06-12 17:35:26

将对performSegue(withIdentifier:sender:)的调用移动到viewWillAppear(_:),而不是case usersignedin = true中的viewDidAppear(_:)

代码语言:javascript
复制
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部件

代码语言:javascript
复制
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)
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-06-12 17:35:57

这是正确的系统行为。调用ViewDidLoad总是比调用ViewDidAppear快得多。如果您想要更改基于userDefault.bool(forKey: "usersignedin")的基本视图控制器,请将该逻辑添加到设置主视图控制器的位置,并在已经登录的情况下交换它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56558929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档