2017-02-14 11 views
0

Я создаю приложение, использующее страницу входа и регистрации. После того, как пользователь зарегистрирует свою учетную запись, он находится в моей базе данных 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() 

} 

}

ответ

0

Вам нужно обработать ответ от веб-сервиса внутри обработчика завершения, как он стоит , пытаясь обработать ответ от веб-службы до того, как веб-сервис вернулся.

//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)") 

     if responseString.range(of: "true") != nil{ 
      DispatchQueue.main.async { 
       var loginSwitch = self.storyboard?.instantiateViewController(withIdentifier: "tabBarController") as! UITabBarController 
       var appDelegate = UIApplication.shared.delegate as! AppDelegate 
       appDelegate.window?.rootViewController = loginSwitch 
      } 
     } 
    } 
    task.resume() 
+0

Ive пробовал это раньше, это дает мне ошибку, потому что task.resume нужно вызвать до того, как я сделаю утверждение if, которое я предполагаю. Он снимает ошибку libC++ abi.dylib: завершение с неперехваченным исключением типа NSException (lldb) и переносит меня в 0 __pthread_kill и говорит, что Thread 10: signal SIGABRT – CodingHelpPls

+0

попробуйте мой обновленный ответ, я забыл, что обработчик завершения работает фоновый поток, поэтому вы не можете модифицировать пользовательский интерфейс непосредственно в обработчике завершения, вам нужно вернуть эту логику в основной поток. – Fonix