Ошибки Logi c с кодом аутентификации по паролю - PullRequest
0 голосов
/ 13 января 2020

Мой код выглядит следующим образом:

@IBAction func clicked(_ sender: Any) {
        let ref = Database.database().reference()
        let pass = password.text
        var firpass = ""
        var bool = false;
        ref.child(name.text as! String).child("password").observeSingleEvent(of: .value, with: { dataSnapshot in
          firpass = dataSnapshot.value as? String ?? ""
            if firpass == pass {
                bool = true
            }
            if bool {
                self.sendname = self.name.text!
                let vc = DatabaseTableViewController(nibName: "DatabaseTableViewController", bundle: nil)
                vc.finalName = self.sendname
                self.navigationController?.pushViewController(vc, animated: true)
                self.performSegue(withIdentifier: "username", sender: self)
            } else {
                let alert = UIAlertController(title: "Error", message: "Incorrect username or password", preferredStyle: UIAlertController.Style.alert)
                alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
                self.present(alert, animated: true, completion: nil)
                self.performSegue(withIdentifier: "failed", sender: self)
            }
        })
    }

    override func shouldPerformSegue(withIdentifier identifier: String?, sender: Any?) -> Bool {
        if let ident = identifier {
            if ident == "failed" {
                return false
            }
        }
        return true
    }

Когда я даю правильное имя пользователя и пароль, я go перехожу на следующую страницу, но я получаю эту ошибку:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<OCRApp.ViewController: 0x105e00f60>) has no segue with identifier 'failed''
*** First throw call stack:
(0x1877aaa48 0x1874d1fa4 0x18b206010 0x104a5b58c 0x104a5ba20 0x104aaa19c 0x104aaa598 0x104a8bb40 0x105cd97fc 0x105cdabd8 0x105ce8c34 0x1877285e4 0x1877235d8 0x187722adc 0x1916a8328 0x18b81dae0 0x104a6cdb0 0x1875ac360)
libc++abi.dylib: terminating with uncaught exception of type NSException

Когда я ввел неправильное имя пользователя / пароль, я все же перешел на следующую страницу, и я получил вышеупомянутую ошибку, но с идентификатором failed; когда я вынул строку self.performSegue(withIdentifier: "failed", sender: self), я все же перешел на следующую страницу и получил сообщение:

Warning: Attempt to present <UIAlertController: 0x102978a00>  on <OCRApp.ViewController: 0x10170a650> which is already presenting <OCRApp.DatabaseTableViewController: 0x10206beb0>

Что я хочу, чтобы перейти на следующую страницу без ошибок, если вы поставили правильную аутентификацию, и получить только предупреждение и остаться на текущей странице, если вы даете неправильную аутентификацию. Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Либо используйте pu sh, либо выполняйте Seegue, вы не можете использовать оба одновременно. это будет pu sh ваш контроллер представления дважды. Я обновил код ниже.

@IBAction func clicked(_ sender: Any) {
    let ref = Database.database().reference()
    let pass = password.text
    var firpass = ""
    var bool = false;
    ref.child(name.text as! String).child("password").observeSingleEvent(of: .value, with: { dataSnapshot in
        firpass = dataSnapshot.value as? String ?? ""
        if firpass == pass {
            bool = true
        }
        if bool {
            self.sendname = self.name.text!
            let vc = DatabaseTableViewController(nibName: "DatabaseTableViewController", bundle: nil)
            vc.finalName = self.sendname
            self.navigationController?.pushViewController(vc, animated: true) // either use push or performSegue, you cant use both.
            //   self.performSegue(withIdentifier: "username", sender: self)
        } else {
            let alert = UIAlertController(title: "Error", message: "Incorrect username or password", preferredStyle: UIAlertController.Style.alert)
            alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
            self.present(alert, animated: true, completion: nil) // if there is an error, you do not need to performSegue.
            //    self.performSegue(withIdentifier: "failed", sender: self)
        }
    })
}
1 голос
/ 13 января 2020

У нас нет информации о ваших переходах, я предлагаю вам instantiate ваш следующий ViewController. Вы можете использовать что-то вроде этого:

let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "NextViewController") as? NextViewController
present(vc, animated: true, completion: nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...