Swift 成功登录

Swift 成功登录,swift,xcode,login,storyboard,Swift,Xcode,Login,Storyboard,下面的代码可以工作,但现在当我按下登录按钮时,它会自动访问我的下一个视图控制器,但我不希望这样。在输入正确的信息之前,我想保持注销状态。我相信问题是当我在登录代码之前输入脚本和Appdelegate信息时。有没有关于如何重组的建议?还是更简洁的代码 @IBAction func loginButton(_ sender: Any) { let storyboard = UIStoryboard(name: "Main", bundle: nil) let tabBarCont

下面的代码可以工作,但现在当我按下登录按钮时,它会自动访问我的下一个视图控制器,但我不希望这样。在输入正确的信息之前,我想保持注销状态。我相信问题是当我在登录代码之前输入脚本和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)
        }
    }

最好的办法是将登录设置器放入完成块方法中,并在完成块中调用
discouse
方法。像这样:

更新:确保检查
文本字段
是否为零

 @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.
   }
}

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

您最好的选择是将您的登录设置程序放入完成块方法中,并在完成块中调用您的
discouse
方法。像这样:

更新:确保检查
文本字段
是否为零

 @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.
   }
}

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

请重试。我认为问题在于,首先您在没有任何条件的情况下设置
rootviewController
。它将引导您进入下一个viewController。您还需要检查
文本字段是否为空

@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
}

请试一试。我认为问题在于,首先您在没有任何条件的情况下设置
rootviewController
。它将引导您进入下一个viewController。您还需要检查
文本字段是否为空

@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
}

一切看起来都不错,但行“applySetters({”返回一个错误,说“在声明之前使用局部变量'applySetters'”缺少括号是解决方案,但我仍然可以在没有任何用户/密码的情况下将登录按钮按到下一个视图…我应该添加断点吗?这里可能存在的问题是loginName loginNameStored loginLastStored和loginLast都可以为零(
.text
.value(用于…)
)。因此,如果您按下按钮而不运行
nil
检查,从技术上讲,只要
文本字段中没有任何内容,您的
discover
就会执行。我将添加一些条件保护语句,检查如何使用它们。很遗憾,您的代码不起作用,但我认为这是一个不同的问题。因此idea是指一旦用户成功输入用户名和密码,登录按钮会将他们带到包含选项卡控制器的视图。我认为开始代码是按钮自动向我发送用户名和用户信息的原因。除了“applySetters({)”一行之外,一切看起来都很好。它返回了一个错误:“在声明之前使用局部变量‘applySetters’”缺少括号是解决方案,但我仍然可以在没有任何用户/密码的情况下将登录按钮按到下一个视图……我是否应该添加断点?这里可能存在的问题是loginName loginNameStored loginLastStored和loginLast都可以为零(
.text
.value(用于…)
)。因此,如果您按下按钮而不运行
nil
检查,从技术上讲,只要
文本字段中没有任何内容,您的
discover
就会执行。我将添加一些条件保护语句,检查如何使用它们。很遗憾,您的代码不起作用,但我认为这是一个不同的问题。因此idea是一旦用户成功输入用户名和密码,登录按钮会将他们带到包含选项卡控制器的视图。我认为开始代码是按钮自动发送给我而不包含用户名和用户信息的原因。在这段代码中,首先设置rootViewController并检查isUserLoggedIn,对吗。其实我不明白你到底想要什么你能解释一下吗it@MidhunKMohan这个想法是,一旦用户成功输入用户名和密码,他们单击“登录”按钮,它会将他们带到一个带有选项卡控制器的视图。我的问题是,当我单击“登录”按钮时,它会自动将我发送到下一个视图,而不需要修改输入任何登录信息。在这段代码中,首先你要设置一个rootViewController并检查isUserLoggedIn,对吗?实际上我不明白你到底想要什么,你能解释一下吗it@MidhunKMohan这个想法是,一旦用户成功地输入了用户名和密码,他们单击登录按钮,它会将他们带到一个具有选项卡控制器。我的问题是,当我单击登录按钮时,它会自动将我发送到下一个视图,而无需输入任何登录信息。