Я создаю приложение, использующее страницу входа и регистрации. После того, как пользователь зарегистрирует свою учетную запись, он находится в моей базе данных mySQL. Поэтому, когда я пытаюсь проверить логин, я буду нажимать логин, но ничего не произойдет, однако я получаю сообщение от своего php, говоря «успех», но приложение не будет переходить, пока я не нажму кнопку «Войти» еще раз. Я думал, что, возможно, моя инструкция if находилась в неправильном месте, но я не могу понять, куда ее переместить, потому что моя задача.заблокирована в том месте, где она есть, и оператор if должен выполняться нажатием кнопки. Я чувствую, что это будет легкой проблемой для исправления, но для жизни меня я не могу понять. Вся помощь ценится, это мой файл loginViewController.swift. (Я удалил мой пост сайта нарочно)[Swift] При попытке использовать мою кнопку входа в систему мне нужно нажать ее дважды после связи с сервером mySQL
import UIKit
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
view.addGestureRecognizer(tap)
}
func dismissKeyboard() {
view.endEditing(true)
}
}
class loginViewController: UIViewController {
struct globalVariable {
static var response = String()
}
@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBAction func loginButtonTap(_ sender: Any) {
do {
let request = try NSMutableURLRequest(url: NSURL(string: "")! as URL)
request.httpMethod = "POST"
//Getting the values from the text fields and creating the post parameter
let postString = "email=\(emailTextField.text!)&password=\(passwordTextField.text!)"
//Adding the parameters to request body
request.httpBody = postString.data(using: String.Encoding.utf8)
//Creating a task to send the post request
let task = URLSession.shared.dataTask(with: request as URLRequest){
data, response, error in
if error != nil{
print("error is=\(error)")
return;
}
print("response = \(response)")
let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
print("responseString = \(responseString)")
globalVariable.response = responseString as! String
}
task.resume()
if globalVariable.response.range(of: "true") != nil{
var loginSwitch = self.storyboard?.instantiateViewController(withIdentifier: "tabBarController") as! UITabBarController
var appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = loginSwitch
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
Ive пробовал это раньше, это дает мне ошибку, потому что task.resume нужно вызвать до того, как я сделаю утверждение if, которое я предполагаю. Он снимает ошибку libC++ abi.dylib: завершение с неперехваченным исключением типа NSException (lldb) и переносит меня в 0 __pthread_kill и говорит, что Thread 10: signal SIGABRT – CodingHelpPls
попробуйте мой обновленный ответ, я забыл, что обработчик завершения работает фоновый поток, поэтому вы не можете модифицировать пользовательский интерфейс непосредственно в обработчике завершения, вам нужно вернуть эту логику в основной поток. – Fonix