2016-03-30 14 views
1

UIAlertControllerからのテキストフィールド値の取得に問題があります。私は値を取得していますが、間違った順序でコードを実行しているようです。以下の関数では、関数呼び出しが文字列を返すと期待していますが、関数が返った時点で値が設定されていません。アラートボックスからのテキスト値の取得

@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 

} 

誰かが私の質問を理解することに問題がある場合は、コメントしてください、私は説明するために全力を尽くします。

答えて

4

okボタンをクリックすると、okアクションハンドラ(クロージャ)が呼び出されます。したがって、ローカル変数sessionNameに値を代入する代わりに、classにsessionName変数を作成します。このヘルプを願って、

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

私のために完璧に動作していること:

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) 
} 

そして、このように関数を呼び出す:あなたはこのように、値を取得するためにコールバックを使用することができます

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

これは私にも同じ問題をもたらします。 sessionNameは、値が割り当てられる前に出力されます。 – JunkJovis

+0

はい、クリックする前にセッション値を印刷します。 addActionから関数を呼び出してそこで作業を行うことができます。 – Sahil

+0

であるか、testDemoで直接値を渡すことができるので、クラス内でvarを作る必要はありません。 UITextFieldとしてtextField = alert.textFields![0]を使用します。 print( "テキストフィールド:\" (textField.text)」) self.testDemo(textField.text) })) またはtestDemo でこれを取得することができますFUNC testDemo(sessionNameの:!助けのための文字列){} – Sahil

0

このコードは:

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

のみ定義されたアクションに対応するボタンがクリックされた瞬間に呼び出されます。したがって、作成の瞬間にUIAlertControllerは呼び出されません。

スウィフトのブロックについて読むと、より明確になります。

+0

どうすれば問題を解決できますか? @wujo – JunkJovis

1

関連する問題