2016-03-30 9 views
1

Ich habe Probleme, einen Textfeldwert von einem UIAlertController zu erhalten. Ich bekomme den Wert, aber es scheint, meinen Code in der falschen Reihenfolge auszuführen. In der Funktion unten erwarte ich, dass der Funktionsaufruf eine Zeichenfolge zurückgibt, aber der Wert wird nicht zum Zeitpunkt der Rückgabe der Funktion festgelegt.Abrufen von Textwert aus der Alarmbox

@IBAction func btnSaveSession(sender: AnyObject) { 

    //Prompt user to enter session name 

    var sessionName: String = "" 

    sessionName = promptUserToEnterSessionName("Save Session", message: "Please enter the name of your custom session below."); 

    print("session Name: " + sessionName) 

    //Save session to firebase. 

    //redirect to create session controller. 
} 

func promptUserToEnterSessionName(title: String, message: String) -> String{ 

    var sessionName: String = "" 

    //1. Create the alert controller. 
    let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert) 

    //2. Add the text field. You can configure it however you need. 
    alert.addTextFieldWithConfigurationHandler({ (textField) -> Void in 
     textField.text = "Enter session name." 
    }) 

    //3. Grab the value from the text field, and print it when the user clicks OK. 
    alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { (action) -> Void in 
     let textField = alert.textFields![0] as UITextField 
     print("Text field: \(textField.text)") 
     sessionName = textField.text! 
    })) 

    // 4. Present the alert. 
    self.presentViewController(alert, animated: true, completion: nil) 

    return sessionName 

} 

Wenn jemand Probleme hat, meine Frage zu verstehen, bitte Kommentar und ich werde mein Bestes tun, um zu erklären.

Antwort

4

Ihr ok Aktionshandler (Schließung) wird aufgerufen, wenn Sie auf ok klicken. Anstatt der lokalen Variablen sessionName einen Wert zuzuweisen, müssen Sie eine sessionName-Variable in der Klasse erstellen.

class YourClass { 
var sessionName: String? 

... 

@IBAction func btnSaveSession(sender: AnyObject) { 

//Prompt user to enter session name 

promptUserToEnterSessionName("Save Session", message: "Please enter the name of your custom session below."); 

} 


func promptUserToEnterSessionName(title: String, message: String) { 


//1. Create the alert controller. 
let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert) 

//2. Add the text field. You can configure it however you need. 
alert.addTextFieldWithConfigurationHandler({ (textField) -> Void in 
    textField.text = "Enter session name." 
}) 

//3. Grab the value from the text field, and print it when the user clicks OK. 
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { (action) -> Void in 
    let textField = alert.textFields![0] as UITextField 
    print("Text field: \(textField.text)") 
    self.sessionName = textField.text! 
    self.testDemo() 
})) 

// 4. Present the alert. 
self.presentViewController(alert, animated: true, completion: nil) 


} 

fun TestDemo() { 
print("session Name: " + self.sessionName) 

//Save session to firebase. 

//redirect to create session controller. 

} 
} 
+0

Dies gibt mir immer noch das gleiche Problem. sessionName wird gedruckt, bevor der Wert zugewiesen wird. – JunkJovis

+0

Ja, es wird Sitzungswert vor dem Klicken gedruckt. Sie können die Funktion von addAction aufrufen und dort arbeiten. – Sahil

+0

oder Sie können direkten Wert in testDemo übergeben, so dass Sie nicht Var in der Klasse machen müssen. Für zB alert.addAction (UIAlertAction (titel: "OK", style: .Default, handler: {(aktion) -> Void in lasst textField = alert.textFields! [0] als UITextField print ("Textfeld: \ (TextField.text) ") self.testDemo (TextField.text) })) oder kann diese erhalten in TestDemo func testDemo (session: String) { } – Sahil

0

Dieser Code:

let textField = alert.textFields![0] as UITextField 
print("Text field: \(textField.text)") 
sessionName = textField.text! 

wird nur im Moment genannt wird die Taste, um die definierte Aktion entsprechend angeklickt wird. Im Moment der Erstellung wird der UIAlertController nicht aufgerufen.

Lesen Sie über Blöcke in Swift, sollte es dann klarer sein.

+0

Also, wie löse ich mein Problem? @ wujo – JunkJovis

1

können Sie einen Rückruf, um den Wert zu erhalten, wie folgt aus:

func AlertPrompt(vista:UIViewController, titulo:String , mensaje:String, aceptar:String, completion: @escaping (_ resultado: String)->()) { 
     let miAlerta = UIAlertController(title: titulo, message: mensaje, preferredStyle: UIAlertControllerStyle.alert) 
     miAlerta.addTextField(configurationHandler: { 
      (textField) -> Void in 
     }) 
     let okBoton = UIAlertAction(title: aceptar, style: UIAlertActionStyle.default, handler: { 
      (action) -> Void in 
      let result = miAlerta.textFields![0] as UITextField 
      // You return the value here 
      completion(result.text! as String) 
     }) 
     miAlerta.addAction(okBoton) 
     let cancelBoton = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil) 
     miAlerta.addAction(cancelBoton) 
     vista.present(miAlerta, animated: true, completion: nil) 
} 

Und die Funktion wie folgt aufrufen:

AlertPrompt(vista: self, titulo: "Title", mensaje: "some message", aceptar: "Acept"){(resultado)->() in 
    print(resultado) 
} 

Das ist für mich perfekt funktioniert hoffen, diese Hilfe

Verwandte Themen