У меня есть страница, где есть 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, все имеют тот же результат, появляется на долю секунды, а затем уходит. Извините за длинный пост, спасибо за любую помощь, я действительно ценю это.