成功登录

时间:2017-08-07 04:44:22

标签: swift xcode login storyboard

下面的代码有效但现在当我按下登录按钮时,它会自动访问我的下一个View Controller,但我不想这样。我想保持注销,直到输入正确的信息。我相信问题是当我在登录代码之前输入故事板和Appdelegate信息时。关于如何重组这个的任何建议?还是更浓缩的代码?

 @IBAction func loginButton(_ sender: Any) {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let tabBarController = storyboard.instantiateViewController(withIdentifier: "TabBarController") as! UITabBarController
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    appDelegate.window?.rootViewController = tabBarController




    let loginName = userNameField.text;
    let loginLast = userLastField.text;

    let loginNameStored = UserDefaults.standard.string(forKey: "loginName");

    let loginLastStored =  UserDefaults.standard.string(forKey: "loginLast");

    if(loginNameStored == loginName)
    {
        if(loginLastStored == loginLast)
        {

            //login is successful

            UserDefaults.standard.set(true, forKey:"isUserLoggedIn");
            UserDefaults.standard.synchronize();
            self.dismiss(animated: true, completion:nil)
        }
    }

2 个答案:

答案 0 :(得分:1)

请尝试。我认为问题首先是你在没有任何条件的情况下设置rootviewController。它会引导您进入下一个viewController。您还想检查textField isEmpty是否。

@IBAction func loginButton(_ sender: Any) {

let loginName = userNameField.text;
let loginLast = userLastField.text;

let loginNameStored = UserDefaults.standard.string(forKey: "loginName");

let loginLastStored =  UserDefaults.standard.string(forKey: "loginLast");

if(loginNameStored == loginName) && (loginLastStored == loginLast)
{
        //login is successful

        UserDefaults.standard.set(true, forKey:"isUserLoggedIn");
        UserDefaults.standard.synchronize();
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let tabBarController = storyboard.instantiateViewController(withIdentifier: "TabBarController") as! UITabBarController
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.window?.rootViewController = tabBarController
}

答案 1 :(得分:0)

您最好的选择是将登录设置器置于完成块方法中,并在完成块内调用dismiss方法。像这样:

更新:请务必检查textFields是否为零。

 @IBAction func loginButton(_ sender: Any) {    
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let tabBarController = storyboard.instantiateViewController(withIdentifier: "TabBarController") as! UITabBarController
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    appDelegate.window?.rootViewController = tabBarController

    guard let loginName = userNameField.text, let loginLast = userLastField.text else { return }

    let loginNameStored = UserDefaults.standard.string(forKey: "loginName");

    let loginLastStored =  UserDefaults.standard.string(forKey: "loginLast");



    if(loginNameStored == loginName)
    {
        if(loginLastStored == loginLast)
        {
            //login is successful
            appplySetters({
                self.dismiss(animated: true, completion:nil)
            })
            return
        }
    }
}

func applySetters(_ completion: @escaping(()->())) {       
   UserDefaults.standard.set(true, forKey:"isUserLoggedIn")
   if UserDefaults.standard.synchronize() {
      completion() // test synchronize here.. it acts as a proper delaying condition before calling completion.
   }
}

完成块内的代码仅在其函数内调用escaping参数时执行。在这种情况下,此参数称为completion

相关问题