2016-03-14 20 views
6

Tôi cần văn bản của trường văn bản được chọn ngay sau khi UIAlertController được trình bày. Tuy nhiên, cách tôi chọn văn bản trong một UITextField tiêu chuẩn không hoạt động ở đây.Chọn văn bản trong trường văn bản của UIAlertController

Đây là những gì tôi đã thử, nhưng tôi dường như không thể làm cho nó hoạt động.

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

Bất kỳ ý tưởng nào?

Trả lời

9

Tôi đã viết lại mã của bạn. lớp học của bạn nên phù hợp với các giao thức UITextFieldDelegate và thực hiện các phương pháp textFieldDidBeginEditing, như thế này:

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

Cảm ơn, @ridvankucuk. Giải pháp của bạn hoạt động tốt.

Nhưng chức năng textfield đại biểu có thể được đơn giản hóa một chút:

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

tôi nhận thấy bạn bỏ qua 'textField.becomeFirstResponder() 'từ @ ridvankucuk của câu trả lời. Có những tình huống mà dòng đó phải được thêm vào lại không? – ToolmakerSteve

+1

@ToolmakerSteve, cá nhân, tôi chưa bao giờ gặp những tình huống như vậy. Trường văn bản đã được trả lời đầu tiên khi phương thức 'textFieldDidBeginEditing:' được gọi. Nhưng có thể bạn có một số trường hợp đặc biệt, khi bạn cần làm cho nó trở lại lần đầu tiên. – seelts

1

Một cách để chọn tất cả văn bản mà không cần thêm một đại biểu:

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

Điều này làm việc hoàn hảo cho tôi! – lox

Các vấn đề liên quan