Swift UITextFieldBeganEditing для выделения всего текста не работает - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь выделить весь текст, когда нажимаю на текстовое поле, и я пытаюсь получить положение текста и вызывать метод textField.selectedTextRange, чтобы выделить текст. Это работает, когда я касаюсь левой части textField, но не правой части. Когда я нажимаю на правую часть, текст просто выравнивается, но не выделяется. Почему это произошло?

И вот проблема, которую я записал как gif:

display

Ниже приведен код в методе textFieldDidBeginEditing:

func textFieldDidBeginEditing(_ textField: UITextField) {

        textField.textAlignment = .left
        self.trailingOfTextField.constant = 80

        let endPosition = textField.endOfDocument

        let startP = textField.position(from: endPosition, offset: 0)
        let endP = textField.position(from: endPosition, offset: -textField.text!.count)

        textField.selectedTextRange = textField.textRange(from: startP!, to: endP!)

 }

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Вам необходимо очистить selectedTextRange для textFieldDidEndEditing

func textFieldDidEndEditing(_ textField: UITextField) {
  textField.selectedTextRange = nil
}

Предварительный просмотр: https://imgur.com/a/xrqz187

Полный код

class ViewController: UIViewController, UITextFieldDelegate {

  @IBOutlet weak var textField: UITextField!
  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    textField.delegate = self
    self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(didTap)))
  }

  func textFieldDidBeginEditing(_ textField: UITextField) {

    textField.textAlignment = .left

    let endPosition = textField.endOfDocument

    let startP = textField.position(from: endPosition, offset: 0)
    let endP = textField.position(from: endPosition, offset: -textField.text!.count)

    textField.selectedTextRange = textField.textRange(from: startP!, to: endP!)
  }

  func textFieldDidEndEditing(_ textField: UITextField) {
    textField.selectedTextRange = nil
  }

  @objc func didTap() {
    view.endEditing(true)
    textField.textAlignment = .center
  }

}
0 голосов
/ 12 апреля 2020

Проблема не имеет ничего общего с тем, что вы нажимаете на левую или правую часть текста. Это связано с упорядочением ваших кликов и состоянием selectedTextRange, когда эти клики произошли.

Что вам нужно сделать, это сбросить selectedTextRange, когда вы отпустите клавиатуру, чтобы он вернулся в его начальное состояние.

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        textField.delegate = self
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        self.view.endEditing(true)
    }
}

extension ViewController: UITextFieldDelegate {
    func textFieldDidBeginEditing(_ textField: UITextField) {
        textField.selectedTextRange = textField.textRange(
            from: textField.beginningOfDocument,
            to: textField.endOfDocument
        )
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        textField.selectedTextRange = nil
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...