UITextField Backspace не работает правильно для первого заполнителя при вводе 6-значного кода проверки в SwiftIOS

Программируем под IOS
Ответить
Anonymous
 UITextField Backspace не работает правильно для первого заполнителя при вводе 6-значного кода проверки в Swift

Сообщение Anonymous »

Я создаю приложение для iPhone, в котором пользователи могут вводить 6-значный код подтверждения, каждая цифра в отдельном поле UITextField. Пользовательский интерфейс создается программно с помощью UIStackView для горизонтального расположения текстовых полей.
Однако я столкнулся с проблемой с функцией возврата на место. Когда курсор находится во втором заполнителе и нажата клавиша возврата, курсор должен переместиться к первому заполнителю и удалить его содержимое. К сожалению, это не работает. Это работает для других текстовых полей, но не для первого заполнителя.
Код:
импорт 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»