无法登录导致未编码的segue?

时间:2017-01-04 07:42:05

标签: swift xcode parse-server

我有一个应用程序设置,用户可以登录和注销(这是通过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
                }   
            }
        })
}

以下是正在进行的分步示意图。 The user starts at the login page and inputs his/her credentials This segues the user (now logged on) to a <code>tabbarViewController</code> They then navigate to another tab and there is a sign out button Pressing the sign out button causes an alert to appear, hitting yes segues the user (now logged out) to the original screen The user is now at the login screen. Inputting the wrong info brings up an alert The alert appears. Hitting yes closes the alert is supposed to leave the user on the login screen. However, there is an immediate segue to the logout screen again... this is neither coded nor manually set in the storyboard

  1. 用户从登录页面开始输入他/她的凭据
  2. 这会将用户(现已登录)置于tabbarViewController
  3. 然后他们导航到另一个标签,并且有一个退出按钮
  4. 按下退出按钮会显示警告,点击“是”将用户(现已注销)移至原始屏幕
  5. 用户现在处于登录屏幕。输入错误信息会显示警告
  6. 出现提醒。点击是关闭警报应该将用户留在登录屏幕上。但是,再次注销屏幕会立即显示...这既没有编码也没有在故事板中手动设置
  7. 我认为随机的事情可能是相关的: 在打开应用程序时,会在第一个VC(登录屏幕)的viewDidAppear上调用初始segue。它通过

    检查是否有用户登录
    if PFUser.current().username? != nil {
          //perform segue
    }
    

    这个segue将它们带到标签栏上的地图部分(而不是问题所在的退出页面)。

    编辑:在&#34; segue&#34;在登出屏幕发生时,登录屏幕下降(就像字面上一样,在屏幕上向下掉落直到看不见,然后退出屏幕是可查看的,这不是应用程序功能中任何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部分中注释掉所有内容,则不会发生此问题。我认为正在发生的是显示警报,然后点击&#34; ok&#34;关闭警报并将应用程序发送回最顶层(也许我错误地称之为我调用它)viewController,它以某种方式退出VC。我认为修复它的一个好方法是在self.present(homescreenVC)代码中添加else或类似的内容,但我不知道如何执行此操作。

1 个答案:

答案 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)

            }   
        })
    }