2016-03-14 22 views
6

Ich brauche den Text des Textfelds, das direkt nach der Darstellung des UIAlertControllers ausgewählt werden soll. Die Art und Weise, wie ich Text in einem Standard-UITextField auswähle, funktioniert hier jedoch nicht.Text im UIAlertController-Textfeld auswählen

Dies ist, was ich versucht habe, aber ich kann es nicht funktionieren scheinen.

let ac = UIAlertController(title: "Rename", message: nil, preferredStyle: .Alert) 
ac.addTextFieldWithConfigurationHandler({ 
    [] (textField: UITextField) in 
    textField.selectedTextRange = textField.textRangeFromPosition(textField.beginningOfDocument, toPosition: textField.endOfDocument) 
    textField.text = "filename.dat" 
    }) 
ac.addAction(UIAlertAction(title: "CANCEL", style: .Cancel, handler: nil)) 
ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: { 
    [] Void in 
    // do something 
    })) 
dispatch_async(dispatch_get_main_queue(), { 
    self.presentViewController(ac, animated: true, completion: nil) 
}) 

Irgendwelche Ideen?

Antwort

9

Ich habe Ihren Code umgeschrieben. Ihre Klasse sollte dem UITextFieldDelegate Protokoll entsprechen und implementieren die textFieldDidBeginEditing Methode, wie folgt aus:

class ViewController: UIViewController, UITextFieldDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let ac = UIAlertController(title: "Rename", message: nil, preferredStyle: .Alert) 
     ac.addTextFieldWithConfigurationHandler({ 
      [] (textField: UITextField) in 
      textField.text = "filename.dat" 
      textField.delegate = self 

     }) 
     ac.addAction(UIAlertAction(title: "CANCEL", style: .Cancel, handler: nil)) 
     ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: { 
      [] Void in 
      // do something 
     })) 
     dispatch_async(dispatch_get_main_queue(), { 
      self.presentViewController(ac, animated: true, completion: nil) 
     }) 

    } 
    func textFieldDidBeginEditing(textField: UITextField) { 
     textField.selectedTextRange = textField.textRangeFromPosition(textField.beginningOfDocument, toPosition: textField.endOfDocument) 
     textField.becomeFirstResponder() 
    } 

} 
2

Danke, @ridvankucuk. Ihre Lösung funktioniert großartig.

Aber Textfeld Delegatfunktion wenig vereinfacht werden kann:

func textFieldDidBeginEditing(_ textField: UITextField) { 
    textField.selectAll(nil) 
} 
+0

Ich bemerke man ausgelassen 'textField.becomeFirstResponder()' aus @ Ridvankucuks Antwort. Gibt es Situationen, in denen diese Linie wieder hinzugefügt werden sollte? – ToolmakerSteve

+1

@ToolmakerSteve, persönlich habe ich solche Situationen nie erlebt. Textfeld ist bereits erste Antwort, wenn 'textFieldDidBeginEditing:' Methode aufgerufen wird. Aber möglicherweise haben Sie einen speziellen Fall, wenn Sie es wieder Ersthelfer machen müssen. – seelts

1

Eine Möglichkeit, den gesamten Text auszuwählen, ohne einen Delegaten hinzu:

present(vc, animated: true) { 
    vc.textFields![0].selectAll(nil) 
} 
+0

Das hat perfekt für mich funktioniert! – lox