2016-07-28 31 views
-3

OK, ich bin neu und arbeite langsam durch einen Entwicklungskurs. Aber mir ist klar, wenn ich das hier knacken könnte, wäre ich weit voraus.Übergeben Sie einen Variablenwert von einer IBAction an ein IBOutlet

Ich mache einen Postaufruf zu einer PHP-Datei auf meinem Server und gebe die JSON-Daten zurück. Das funktioniert. und ich kann drucken Sie die Variable

print("firstNameValue: \(firstNameValue)") 

ich jetzt ausgegeben werden soll, den Wert einer Variablen ... firstNameValue in ein Textfeld namens Textfield.

Ich bin neu in Swift und ich denke "globale Variable?". Dies hat funktioniert, aber ich möchte auf die Antwort vom HTTP-Aufruf warten, um das Textfeld zu vervollständigen und dann zu aktualisieren.

Ich hoffe, Sie können helfen. Ich bin sehr neu in OOP und mein Kopf platzt.

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var feel: UITextField! 

    @IBAction func anxious(sender: AnyObject) { 



     let myUrl = NSURL(string: "http://mywebsite.com/Jamesbond.php"); 

     let request = NSMutableURLRequest(URL:myUrl!); 

     request.HTTPMethod = "POST";// Compose a query string 

     let postString = "firstName=James&lastName=Bond"; 

     request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding); 

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

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

      // You can print out response object 
      print("response = \(response)") 

      // Print out response body 
      let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("responseString = \(responseString)") 

      //Let's convert response sent from a server side script to a NSDictionary object: 
      do { 
       let myJSON = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary 

       if let parseJSON = myJSON { 

        // Now we can access value of First Name by its key 
        let firstNameValue = parseJSON["firstName"] as? String 

        print("firstNameValue: \(firstNameValue)") 

        EDIT::the below two lines solved it. 
        dispatch_async(dispatch_get_main_queue()) { 
        self.textField.text = firstNameValue} 


       } 
      } catch { 
       print(error) 
      } 
     } 
     task.resume() 

    } 
    @IBOutlet weak var textField: UITextField! 




    @IBAction func submit(sender: AnyObject) { 
     print("hello") 
     let a = 9 
     let b = 10 
     let c = (a*b) 
     textField.text="You are a banana \(c)" 

    } 




    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
+2

Ersetzen Sie einfach die * Ich möchte diesen Wert ... * Kommentar mit dem Code, um das Textfeld zu aktualisieren und Sie sind fertig. – vadian

+0

Vielen Dank, dass das nicht funktioniert, das ist das erste, was ich ausprobiert habe. textField.text = "name = \ (firstNameValue!)" das kommt mit einem fehler zurück – uberphoebe

+0

Es sagt, dass ich mich gezwungen habe, mich selbst zu setzen. vor wie self.textField.text, aber wenn ich dies tue, erzeugt es keinen Kompilierungsfehler, aber kein Wert wird in das Feld eingefügt. – uberphoebe

Antwort

0

Das Textfeld muss in den Abschluss-Handler aktualisiert werden, da dataTaskWithRequest asynchron arbeitet.

Dieser Code führt alle erforderlichen optionalen Bindungsüberprüfungen durch und führt die Zeile aus, um das Textfeld im Hauptthread zu aktualisieren.

...  
do { 
    if let myJSON = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String:AnyObject], 
     firstNameValue = parseJSON["firstName"] as? String { 
     print("firstNameValue: \(firstNameValue)") 

     dispatch_async(dispatch_get_main_queue()) { 
      self.textField.text = firstNameValue 
     } 
    } 
} 
catch { 
    print(error) 
} 

Die Option .MutableContainers wird in diesem Fall nicht benötigt.

+0

Danke ich bekomme das ... am Ende löste der Code unten gelöst es aber von dem, was Sie sagen, gibt es einige redundante Code hier. – uberphoebe

+0

Fast dort ... siehe bearbeiten auf Hauptquestion für die Lösung. Danke für deine Hilfe – uberphoebe