2016-03-14 73 views
6

我需要在UIAlertController出現後立即選擇文本字段的文本。但是,我在標準UITextField中選擇文本的方式在這裏不起作用。在UIAlertController的文本字段中選擇文本

這是我試過的,但我似乎無法得到它的工作。

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

任何想法?

回答

9

我重寫了你的代碼。您的類應符合UITextFieldDelegate協議並實施textFieldDidBeginEditing方法,像這樣:

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

謝謝,@ridvankucuk。您的解決方案很好。

但文本字段委託功能,可以簡化一點:

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

從我注意到你省略'textField.becomeFirstResponder()' @ ridvankucuk的回答。有沒有應該重新添加該行的情況? – ToolmakerSteve

+1

@ToolmakerSteve,我個人從未遇到這種情況。當調用'textFieldDidBeginEditing:'方法時,文本字段已經是第一個響應者。但是當你需要再次成爲第一響應者時,可能會有一些特殊情況。 – seelts

1

選擇所有的文本,而不添加代理人的一種方式:

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

這對我來說非常合適! – lox