Мне нужно сообщить о сбое входа в систему с помощью запроса POST, используя UIAlert. функция входа в систему находится в классе, вызываемом моим контроллером, но я не могу представить предупреждение.
Я получил на консоли это сообщение:
Предупреждение: попытка представить на
чей вид не в окне
иерархии
!
в моем логине ВК я звоню
loginWithCompletition
, и, скажем, пароль неверный, я бы хотел показать это из расширения uiviewcontroller
customErrorMessageAlert (errorMessage: «сообщение об ошибке»)
но я не уверен, что это правильный способ обработки ошибки, и
в моем классе:
class LoginHandler : UIViewController{
...}
У меня есть этот метод: loginWithCompletition
func loginWithCompletition(APIUrlString: String, usernameToUse: String, passwordToUse: String, completion: @escaping (String) -> ()) {
let params = "email=\(usernameToUse)&pass=\(passwordToUse)"
let myUrl = URL(string: APIUrlString)
var request = URLRequest(url: myUrl!)
request.httpMethod = "POST"
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpBody = params.data(using: String.Encoding.utf8, allowLossyConversion: false)
//if all went ok
let task = URLSession.shared.dataTask(with: request) { (data: Data?, response : URLResponse?, error: Error?) in
if let httpResponse = response as? HTTPURLResponse {
print("error \(httpResponse.statusCode)")
let responseCode = httpResponse.statusCode
if responseCode == 401 {
DispatchQueue.main.async {
self.customErrorMessageAlert(errorMessage: "cannot login, wrong mail and password")
}
}
}
//here we already get the response
if error != nil {
print("error! \(String(describing: error))")
customErrorMessageAlert(errorMessage: "error message")
return
}
//if all is ok, convert data to json object
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = json {
// print("parseJSON is: \(parseJSON)")
let accessToken = parseJSON["token"] as? String
// print("token is: \(String(describing: accessToken))")
if let accessToken = accessToken {
completion(accessToken)
} else {
print("accessToken is nil")
return
}
DispatchQueue.main.async {
print("all ok!")
}
} else {
print("parseJSON is empty")
}
} catch {
print("error, cannot complete json serialization")
print("error: \(error.localizedDescription)")
return
}
}
task.resume()
//end
}
мое оповещение:
func customErrorMessageAlert(errorMessage: String) {
//use this method as default error message and alert
print("Warning! \(errorMessage) in: \(String(describing: self.title ?? self.description))")
let alertController = UIAlertController(title: "Error!", message: errorMessage , preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "Close Alert", style: .default, handler: nil)
alertController.addAction(defaultAction)
self.present(alertController, animated: true, completion: nil)
}