下面的代码有效但现在当我按下登录按钮时,它会自动访问我的下一个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)
}
}
答案 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
。