我有一个应用程序设置,用户可以登录和注销(这是通过heroku托管的Parse服务器,使用Parse框架处理)。
要登录,用户输入凭据,如果服务器验证它们,则segue将它们移动到另一个viewcontroller。注销用户退出应用程序并将其转移回登录屏幕。这些工作正常。
如果初始登录凭据不正确,则会显示一条警告,提示用户重试并且用户未登录(显然)并保留在登录屏幕上。
但是,如果用户登录,注销,然后输入错误的凭据(按此顺序,没有关闭模拟器),则会出现问题。错误的凭据会显示提示警报;点击" OK"关闭警报,用户没有登录,但是视图被锁定到注销屏幕(注销按钮是......这应该只有登录用户才能访问)。不存在segue segue(编码或在故事板上),将用户从登录直接移动到注销屏幕。
没有任何操作可以工作,因为许多人都需要用户ID,并且没有任何操作,因为没有人登录。我不知道为什么不正确的登录会以这种方式移动VC,因为不存在可以做到这一点的segue 。有一个反向运动(退出时),但没有朝那个方向运动。
有人有什么想法吗?以下是相关的登录代码。
@IBAction func signInTapped(_ sender: UIButton) {
UIApplication.shared.beginIgnoringInteractionEvents()
PFUser.logInWithUsername(inBackground: userNameTextField.text!, password: passwordTextField.text!, block: { (user, error) in
if user != nil{
self.performSegue(withIdentifier: "signInSegue", sender: self)//if the sign in works
} else{
if let errorString = (error! as NSError).userInfo["error"] as? String{
let errorMessage = errorString
self.displayAlert("Failed login", message: errorMessage)//this is the code run when the login fails, yet it somehow can sometimes segue to the other viewcontroller
}
}
})
}
tabbarViewController
我认为随机的事情可能是相关的:
在打开应用程序时,会在第一个VC(登录屏幕)的viewDidAppear
上调用初始segue。它通过
if PFUser.current().username? != nil {
//perform segue
}
这个segue将它们带到标签栏上的地图部分(而不是问题所在的退出页面)。
编辑:在" segue"在登出屏幕发生时,登录屏幕下降(就像字面上一样,在屏幕上向下掉落直到看不见,然后退出屏幕是可查看的,这不是应用程序功能中任何segues的方式)。此外,发生此转换时仅调用viewDidAppear
代码, NOT viewDidLoad
代码。
编辑2:我认为这个问题与视图层次结构有关。以下是登录功能的代码:
PFUser.logInWithUsername(inBackground: userNameTextField.text!, password: passwordTextField.text!, block: { (user, error) in
if user?.username != nil{
self.performSegue(withIdentifier: "signInSegue", sender: self)
} else{ //if everything in this code block is commented, the issue does not occur
if let errorString = (error! as NSError).userInfo["error"] as? String{
let errorMessage = errorString
self.displayAlert("Failed login", message: errorMessage)
}
}
})
如果我在if语句的else
部分中注释掉所有内容,则不会发生此问题。我认为正在发生的是显示警报,然后点击" ok"关闭警报并将应用程序发送回最顶层(也许我错误地称之为我调用它)viewController,它以某种方式退出VC。我认为修复它的一个好方法是在self.present(homescreenVC)
代码中添加else
或类似的内容,但我不知道如何执行此操作。
答案 0 :(得分:0)
@IBAction func signInTapped(_ sender: UIButton) {
UIApplication.shared.beginIgnoringInteractionEvents()
PFUser.logInWithUsername(inBackground: userNameTextField.text!, password: passwordTextField.text!, block: { (user, error) in
if error != nil {
if let errorString = (error! as NSError).userInfo["error"] as? String{
let errorMessage = errorString
self.displayAlert("Failed login", message: errorMessage)
}
}
else {
self.performSegue(withIdentifier: "signInSegue", sender: self)
}
})
}