textfield.becomeFirstResponder не держит текстовое поле сфокусированным в быстром - PullRequest
1 голос
/ 08 февраля 2020

У меня есть страница, где есть UITextField, который я добавляю программно, я устанавливаю тип текста на число, добавляю ограничения и все такое. Затем я добавляю готовую кнопку в accessoryView текстового поля и добавляю функцию, которая запускается при нажатии этой готовой кнопки. Моя проблема в том, что при загрузке страницы я хочу, чтобы текстовое поле было сфокусировано, а клавиатура отображалась. Я установил на него элемент стал стал первым, но когда страница загружается, клавиатура появляется на долю секунды, затем сразу исчезает и запускаются методы делегата.

Мне нужно найти способ сделать текстовое поле активным "," сфокусированный ", как хотите, чтобы он назывался при загрузке страницы, и чтобы клавиатура была там и была готова. Кажется, я не могу найти какую-либо помощь, кроме как вызвать на нем функцию createFirstResponder, которая работает только в течение доли секунды.

Вот код, который я использую для создания страницы и запуска всего, я упростил ее, чтобы уменьшить беспорядок и время чтения, но если вам нужна дополнительная информация, пожалуйста, дайте мне знать, и я буду рад предоставить полный код ...

class AgeViewController: UIViewController {

  var selectedAge: Int = 0
  var textInput: UITextField!

  let settings = UserDefaults.standard

  override func viewDidLoad() {
    super.viewDidLoad()
    createPage()
  }

  override func viewWillAppear(_ animated: Bool) {
    textInput.becomeFirstResponder()
    //I have tried this in both viewWillAppear and viewDidAppear
  }

  func createPage() {
    textInput = UITextField()
    textInput.font = .systemFont(ofSize: 50)
    textInput.placeholder = "35"
    textInput.borderStyle = .none
    textInput.keyboardType = .numberPad
    textInput.returnKey = .done
    textInput.textAlignment = .right
    addDoneButton()
    textInput.delegate = self
    view.addSubView(textInput)
    //create a label and add it to the page
  }

  private fun addDoneButton() {
    let doneToolbar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50)
    doneToolbar.barStyle = .default
    let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(doneTapped))
    let items = [flexSpace, done]
    doneToolbar.sizeToFit()
    textInput.inputAccessoryView = doneToolbar
  }

  @objc func doneTapped() {
    textInput.resignFirstResponder()
  }

}

extension AgeViewController: UITextFieldDelegate {
  func textFieldDidBeginEditing(_ textField: UITextField) {
    textField.textColor = UIColor(named: "text")!
  }
  func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) {
    if textField.text != nil {
      selectedAge = Int(textField.text!) ?? 35
      settings.set(selectedAge, forKey: Strings.age)
    } else {
      textField.textColor = UIColor(named: "grayText")!
    }
  }

Как я уже сказал, страница загружается, клавиатура появляется на долю секунды уходит, и методы делегата вызываются для didEndEditing. Я не понимаю, почему это не остается сфокусированным, я звоню, чтобы стать стал первым ответчиком Я пытался вызвать textInput.becomeFirstResponder () в 3 разных местах, все с одинаковым результатом. Первый был сразу после того, как я добавил подпредставление в представление, затем я попытался в viewDidAppear и, наконец, в viewWillAppear, все имеют тот же результат, появляется на долю секунды, а затем уходит. Извините за длинный пост, спасибо за любую помощь, я действительно ценю это.

...