2016-03-14 11 views
6

Ho bisogno che il testo del campo di testo venga selezionato subito dopo la presentazione di UIAlertController. Tuttavia, il modo in cui seleziono il testo in un UITextField standard non funziona qui.Seleziona testo nel campo di testo di UIAlertController

Questo è quello che ho provato, ma non riesco a farlo funzionare.

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

Qualche idea?

risposta

9

Ho riscritto il codice. La classe deve essere conforme al protocollo UITextFieldDelegate e implementare il metodo textFieldDidBeginEditing, in questo modo:

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

Grazie, @ridvankucuk. La tua soluzione funziona alla grande.

Ma la funzione textfield delegato può essere semplificata po ':

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

Ho notato che omesso 'textField.becomeFirstResponder()' da @ risposta di ridvankucuk. Ci sono situazioni in cui questa linea dovrebbe essere aggiunta? – ToolmakerSteve

+1

@ToolmakerSteve, personalmente, non ho mai incontrato situazioni del genere. Il campo di testo è già il primo risponditore quando viene chiamato il metodo 'textFieldDidBeginEditing:'. Ma potresti avere qualche caso particolare, quando hai bisogno di farlo di nuovo prima. – seelts

1

Un modo per selezionare tutto il testo senza l'aggiunta di un delegato:

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

Questo ha funzionato perfettamente per me! – lox

Problemi correlati