Выделите текст в текстовом поле UIAlertController

Мне нужно, чтобы текст текстового поля был выбран сразу после представления UIAlertController. Однако способ выделения текста в стандартном UITextField здесь не работает.

Это то, что я пробовал, но у меня не получается заставить его работать.

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

Любые идеи?


person Antonin Charvat    schedule 14.03.2016    source источник


Ответы (3)


Я переписал ваш код. Ваш класс должен соответствовать протоколу 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()
    }

}
person ridvankucuk    schedule 14.03.2016

Способ выделить весь текст без добавления делегата:

present(vc, animated: true) {
    vc.textFields?.first?.selectAll(nil)
}
person zgjie    schedule 21.12.2017

Спасибо, @ridvankucuk. Ваше решение отлично работает.

Но функцию делегата текстового поля можно немного упростить:

func textFieldDidBeginEditing(_ textField: UITextField) {
    textField.selectAll(nil)
}
person seelts    schedule 31.10.2016
comment
Я заметил, что вы пропустили textField.becomeFirstResponder() в ответе @ ridvankucuk. Есть ли ситуации, когда нужно добавить эту строку? - person ToolmakerSteve; 14.03.2017
comment
@ToolmakerSteve, лично я с такими ситуациями не встречал. Текстовое поле уже является первым респондентом, когда вызывается метод textFieldDidBeginEditing:. Но может быть у вас особый случай, когда вам снова нужно сделать его первым респондентом. - person seelts; 14.03.2017