2016-03-14 4 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. Ваше решение отлично работает.

Но функция TextField делегат может быть упрощена немного:

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