2016-05-24 3 views
0

「dataTaskWithRequest」から変数 'response'を取得する必要があります。今、「応答」は角括弧の外側にあるため見つかりません。どうすればUIAlertに応答変数を渡すことができますか?Swift UIAlert - dataTaskWithRequestからデータを取得する

@IBAction func buttonCreateAccount(sender: AnyObject) { 
      let request = NSMutableURLRequest(URL: NSURL(string: "http://www.example.com/createaccount.php")!) 
      request.HTTPMethod = "POST" 
      let postString = "user_name=\(username.text!)&email=\(email.text!)&password=\(password.text!)" 
      request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 

      let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
       data, response, error in 

       if error != nil { 
        print("error=\(error)") 
        return 
       } 

       print("response = \(response)") 

       let response = String(data: data!, encoding: NSUTF8StringEncoding) 
       print("responseString = \(response)") 

      } 

      task.resume() 

//problem is here. 'response' variable cannot be taken from above. i need it to be taken from above. 
      if response == "Username taken" { 
       if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8 
        let myAlert: UIAlertController = UIAlertController(title: "Registration", message: response, preferredStyle: .Alert) 
        myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
        self.presentViewController(myAlert, animated: true, completion: nil) 
       } else { // iOS 7 
        let alert: UIAlertView = UIAlertView() 
        alert.delegate = self 

        alert.title = "Registration" 
        alert.message = "Testing" 
        alert.addButtonWithTitle("OK") 

        alert.show() 
       } 
      } else { 
       if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8 
        let myAlert: UIAlertController = UIAlertController(title: "Registration", message: response, preferredStyle: .Alert) 
        myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
        self.presentViewController(myAlert, animated: true, completion: nil) 
       } else { // iOS 7 
        let alert: UIAlertView = UIAlertView() 
        alert.delegate = self 

        alert.title = "Registration" 
        alert.message = "Testing" 
        alert.addButtonWithTitle("OK") 

        alert.show() 
        self.dismissViewControllerAnimated(true, completion: {}); 
       } 
      } 
     } 
+1

完了ブロック(あなたはすぐに(NSURLSession.sharedSession 'の下に指定されているコード)をdataTaskWithRequest(リクエスト)'非同期に実行を取得しようとしている - それはまで実行されません。二つの機能に分離。リクエストが実際に完了します。この関数が呼び出された後、おそらく数ミリ秒から数秒かかるでしょう。あなたのコメントの下のコードは即座に**実行されます。その時点で、あなたは '応答 'を持っていません。 すべての応答処理コードを完了ブロックに移動する必要があります。応答が利用可能になるまで実行されません。 –

答えて

2

dataTaskWithRequest実行非同期:ありがとう

ここでは私のコードです。あなたはすぐに応答を得ることはありません。

@IBAction func buttonCreateAccount(sender: AnyObject) { 
    let request = NSMutableURLRequest(URL: NSURL(string: "http://www.example.com/createaccount.php")!) 
    request.HTTPMethod = "POST" 
    let postString = "user_name=\(username.text!)&email=\(email.text!)&password=\(password.text!)" 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     data, response, error in 

     if error != nil { 
      print("error=\(error)") 
      return 
     } 

     print("response = \(response)") 

     let response = String(data: data!, encoding: NSUTF8StringEncoding) 
     print("responseString = \(response)") 

     // Now that the response is ready, call the other function to handle it 
     handleResponse(response) 
    } 

    task.resume() 
} 

func handleResponse(response: String) { 
    if response == "Username taken" { 
     if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8 
      let myAlert: UIAlertController = UIAlertController(title: "Registration", message: response, preferredStyle: .Alert) 
      myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
      self.presentViewController(myAlert, animated: true, completion: nil) 
     } else { // iOS 7 
      let alert: UIAlertView = UIAlertView() 
      alert.delegate = self 

      alert.title = "Registration" 
      alert.message = "Testing" 
      alert.addButtonWithTitle("OK") 

      alert.show() 
     } 
    } else { 
     if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8 
      let myAlert: UIAlertController = UIAlertController(title: "Registration", message: response, preferredStyle: .Alert) 
      myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
      self.presentViewController(myAlert, animated: true, completion: nil) 
     } else { // iOS 7 
      let alert: UIAlertView = UIAlertView() 
      alert.delegate = self 

      alert.title = "Registration" 
      alert.message = "Testing" 
      alert.addButtonWithTitle("OK") 

      alert.show() 
      self.dismissViewControllerAnimated(true, completion: {}); 
     } 
    } 
} 
+0

「NSURLResponse型の値を期待される引数型に変換できません。 '文字列? '" – johnjay22113

+0

ああ...私は応答が文字列であるのを見ませんでした。関数の引数を 'func handleResponse(response:String)'に変更してください。 –

+0

ありがとう。私は今これを得る: "オプションの型の値 'String?'アンラップされていない;あなたは '!'または '?'? " – johnjay22113

関連する問題