Swift3 и Xcode8: невозможно выполнить переход после выполнения функции

Я пытаюсь выполнить переход на главный экран после проверки правильности введенного имени пользователя и пароля, и если они неверны, я пытаюсь показать предупреждающее сообщение. Я не успешен в выполнении ни того, ни другого. Потому что, как только я нажимаю кнопку входа, отображается белый экран. Ниже мой код:

Выполнение перехода следующим методом:

@IBAction func didClickLogin(_ sender: Any) {
    self.progressIndicator.isHidden = false
    self.progressIndicator.startAnimating()
    let enteredUserName = mMobileNumber.text
    let enteredPassword = mPassword.text
    //performing validation for username and password
    didUserLogin(username: enteredUserName!, password: enteredPassword!)
    return true
}

Моя функция didLogin:

func didUserLogin(username: String, password: String) {
    let requestString = Constants.BASE_URL+"/mlogin"
    let parameters: Parameters =  ["username":username, "password":password]
    let headers = ["Authorization": "Basic \(Constants.base64LoginString)"]

    Alamofire.request(requestString, method:.post, parameters: parameters, encoding: URLEncoding.default, headers: headers).responseJSON { response in
        //to get status code
        switch response.result {
        case .success(let data):
            let json = JSON(data)
            switch (json["status"].stringValue){
            case "200":
                DispatchQueue.main.async {
                    self.performSegue(withIdentifier: "loginSuccess", sender: self)
                }
                break

            case "401":
                self.progressIndicator.isHidden = true
                self.progressIndicator.stopAnimating()
                let alert = Constants()
                alert.showAlert(fromController: self, alertMessage: "Entered username or password is incorrect")
                break

            case .failure(let error):
                print("Request failed with error: \(error)")
            }
        }
    }
}

Пожалуйста, дайте мне знать, какую ошибку я делаю, и, пожалуйста, дайте мне знать, какие изменения мне нужно сделать. Я также не могу отображать предупреждающее сообщение. Я получаю следующее предупреждение:

Warning: Attempt to present <UIAlertController: on whose view is not in the window hierarchy!

person focus    schedule 02.11.2016    source источник
comment
Вы вызываете didUserLogin изнутри shoulcPerformSegue, что указывает на то, что вы уже находитесь в середине перехода, поэтому вы не можете выполнить еще один переход или отобразить предупреждение. Вы также должны выполнить асинхронную операцию в shouldPerformSegue. Вы должны проверить вход в систему в ответ на нажатие кнопки или подобное и использовать результат для запуска перехода.   -  person Paulw11    schedule 02.11.2016
comment
@Paulw11 Paulw11 Хорошо, большое спасибо, сделаю это и проверю.   -  person focus    schedule 02.11.2016
comment
@Paulw11Paulw11 Я добавил IBAction для кнопки входа в систему, и в ответ я вызываю PerformSegue, но этого все равно не происходит??   -  person focus    schedule 02.11.2016
comment
Можете ли вы отредактировать свой вопрос, чтобы показать обновленный код?   -  person Paulw11    schedule 02.11.2016
comment
@Paulw11 Paulw11 Я обновил вопрос, пожалуйста, проверьте   -  person focus    schedule 02.11.2016


Ответы (2)


Я думаю, вам просто нужно реализовать следующий метод, и он должен работать нормально:

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
   if (segue.identifier == "YOUR_SCENE_IDENTIFIER_TO_THE_NEXT_SCREEN") {
    // pass some data to the destination vc, if you need
   }

}

person Tushar    schedule 02.11.2016

Код для предварительного перехода:

performSegue(withIdentifier: "loginSuccess", sender: nil)
person Nathan C    schedule 17.02.2017