2016-03-14 9 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

関連する問題