Однако я столкнулся с проблемой с функцией возврата на место. Когда курсор находится во втором заполнителе и нажата клавиша возврата, курсор должен переместиться к первому заполнителю и удалить его содержимое. К сожалению, это не работает. Это работает для других текстовых полей, но не для первого заполнителя.
Код:
импорт UIKit
Код: Выделить всё
class SignUpPhoneVerificationViewController: UIViewController, UITextFieldDelegate {
let codeTextFieldStackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.distribution = .fillEqually
stackView.spacing = 10
stackView.translatesAutoresizingMaskIntoConstraints = false
return stackView
}()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
private func setupUI() {
view.addSubview(codeTextFieldStackView)
for i in 0.. Bool {
// Only allow numbers
guard CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: string)) || string.isEmpty else {
return false
}
if string.isEmpty {
// Backspace was pressed
if textField.text?.isEmpty ?? true {
if let previousTextField = view.viewWithTag(textField.tag - 1) as? UITextField {
previousTextField.text = ""
previousTextField.becomeFirstResponder()
} else {
// Move cursor to the first text field if it's the second field
if textField.tag == 1, let firstTextField = view.viewWithTag(0) as? UITextField {
firstTextField.text = ""
firstTextField.becomeFirstResponder()
}
}
} else {
textField.text = ""
}
return false
}
if let text = textField.text, (text + string).count > 1 {
return false
}
textField.text = string
let nextTag = textField.tag + 1
if let nextResponder = view.viewWithTag(nextTag) {
nextResponder.becomeFirstResponder()
} else {
textField.resignFirstResponder()
}
return false
}
}
class BackspaceTextField: UITextField {
override func deleteBackward() {
if text?.isEmpty ?? true {
if let previousTextField = superview?.viewWithTag(tag - 1) as? UITextField {
previousTextField.text = ""
previousTextField.becomeFirstResponder()
} else {
// Move cursor to the first text field if it's the second field
if tag == 1, let firstTextField = superview?.viewWithTag(0) as? UITextField {
firstTextField.text = ""
firstTextField.becomeFirstResponder()
} else {
super.deleteBackward()
}
}
} else {
text = ""
}
}
}
- Реализован собственный класс UITextField (BackspaceTextField) для обработки нажатий клавиш возврата.
- Добавлена кнопка «Очистить» для сбросил все текстовые поля, но проблема осталась.
Когда курсор находится во втором заполнителе и нажата клавиша возврата, курсор должен переместиться к первому заполнителю и очистить его содержимое.
Фактическое действие:
Курсор не перемещается к первому заполнителю и не очищает его содержимое. Первый заполнитель сохраняет свое предыдущее значение.
Подробнее здесь: https://stackoverflow.com/questions/787 ... in-a-6-dig
Мобильная версия