Текстовое поле форматирования SwiftUI для ввода кредитной карты «xxxx-xxxx-xxxx-xxxx» ⇐ IOS
Текстовое поле форматирования SwiftUI для ввода кредитной карты «xxxx-xxxx-xxxx-xxxx»
Я хочу написать собственное TextField в SwiftUI, чтобы иметь ввод в формате кредитной карты, например «xxxx-xxxx-xxxx-xxxx», я смотрел на эти ответы https://stackoverflow.com/a/48252437, но у меня проблемы с UIViewRepresentable: когда я хочу вставить числа в исходный текст, он, похоже, не обновляет его в соответствии с форматом.
Текстовое поле покажет вам 12345, но мне нужно 1234 5
struct ContentView: Просмотр { @State var cardNumber: String = "12345" // UITextField { пусть просмотр = UITextField() view.addTarget(context.coordinator, action: #selector(Coordinator.reformatAsCardNumber), для: .editingChanged) view.delegate = context.coordinator обратный вид } общественная функция updateUIView (_ uiView: UITextField, контекст: Контекст) { uiView.text = число // Координатор { Координатор($номер) } // МАРК: Координатор Координатор публичного класса: NSObject, UITextFieldDelegate { Номер @Binding var: строка частный вар previousTextFieldContent: String? частный вар previousSelection: UITextRange? init(_ число: Binding) { self._number = число } func textField (_ textField: UITextField, mustChangeCharactersIn диапазон: NSRange, replaceString string: String) -> Bool { предыдущийTextFieldContent = textField.text previousSelection = textField.selectedTextRange вернуть истину } @objc func rematAsCardNumber(textField: UITextField, для события: UIControl.Event) { вар targetCursorPosition = 0 если let startPosition = textField.selectedTextRange?.start { targetCursorPosition = textField.offset(от: textField.beginningOfDocument, до: startPosition) } var cardNumberWithoutSpaces = "" если пусть текст = textField.text { cardNumberWithoutSpaces = self.removeNonDigits(строка: текст иPreserveCursorPosition: &targetCursorPosition) } если cardNumberWithoutSpaces.count > 16 { textField.text = предыдущийTextFieldContent textField.selectedTextRange = предыдущий выбор возвращаться } let cardNumberWithSpaces = self.insertCreditCardSpaces(cardNumberWithoutSpaces, saveCursorPosition: &targetCursorPosition) textField.text = номер карты с пробелами число = номер карты с пробелами if let targetPosition = textField.position(from: textField.beginningOfDocument, offset: targetCursorPosition) { textField.selectedTextRange = textField.textRange(от: targetPosition, до: targetPosition) } } func removeNonDigits (строка: String и PreserveCursorPosition курсорПозиция: inout Int) -> String { вар digitsOnlyString = "" пусть originalCursorPosition = курсорПозиция for i в Swift.stride(from: 0, to: string.count, by: 1) { letcharacterToAdd = string[string.index(string.startIndex, offsetBy: i)] ifcharacterToAdd >= "0" &&characterToAdd String { вар stringWithAddedSpaces = "" пусть курсорПозицияВПространственнойСтроке = курсорПозиция для я в 0.. 0 && (i % 4) == 0 { stringWithAddedSpaces.append(" ") если я < курсорПозиционинспецелессстринг { курсорПозиция += 1 } } пусть символToAdd = строка[ string.index(string.startIndex, offsetBy: i) ] stringWithAddedSpaces.append(characterToAdd) } возвращаемая строкаWithAddedSpaces } } }
Я хочу написать собственное TextField в SwiftUI, чтобы иметь ввод в формате кредитной карты, например «xxxx-xxxx-xxxx-xxxx», я смотрел на эти ответы https://stackoverflow.com/a/48252437, но у меня проблемы с UIViewRepresentable: когда я хочу вставить числа в исходный текст, он, похоже, не обновляет его в соответствии с форматом.
Текстовое поле покажет вам 12345, но мне нужно 1234 5
struct ContentView: Просмотр { @State var cardNumber: String = "12345" // UITextField { пусть просмотр = UITextField() view.addTarget(context.coordinator, action: #selector(Coordinator.reformatAsCardNumber), для: .editingChanged) view.delegate = context.coordinator обратный вид } общественная функция updateUIView (_ uiView: UITextField, контекст: Контекст) { uiView.text = число // Координатор { Координатор($номер) } // МАРК: Координатор Координатор публичного класса: NSObject, UITextFieldDelegate { Номер @Binding var: строка частный вар previousTextFieldContent: String? частный вар previousSelection: UITextRange? init(_ число: Binding) { self._number = число } func textField (_ textField: UITextField, mustChangeCharactersIn диапазон: NSRange, replaceString string: String) -> Bool { предыдущийTextFieldContent = textField.text previousSelection = textField.selectedTextRange вернуть истину } @objc func rematAsCardNumber(textField: UITextField, для события: UIControl.Event) { вар targetCursorPosition = 0 если let startPosition = textField.selectedTextRange?.start { targetCursorPosition = textField.offset(от: textField.beginningOfDocument, до: startPosition) } var cardNumberWithoutSpaces = "" если пусть текст = textField.text { cardNumberWithoutSpaces = self.removeNonDigits(строка: текст иPreserveCursorPosition: &targetCursorPosition) } если cardNumberWithoutSpaces.count > 16 { textField.text = предыдущийTextFieldContent textField.selectedTextRange = предыдущий выбор возвращаться } let cardNumberWithSpaces = self.insertCreditCardSpaces(cardNumberWithoutSpaces, saveCursorPosition: &targetCursorPosition) textField.text = номер карты с пробелами число = номер карты с пробелами if let targetPosition = textField.position(from: textField.beginningOfDocument, offset: targetCursorPosition) { textField.selectedTextRange = textField.textRange(от: targetPosition, до: targetPosition) } } func removeNonDigits (строка: String и PreserveCursorPosition курсорПозиция: inout Int) -> String { вар digitsOnlyString = "" пусть originalCursorPosition = курсорПозиция for i в Swift.stride(from: 0, to: string.count, by: 1) { letcharacterToAdd = string[string.index(string.startIndex, offsetBy: i)] ifcharacterToAdd >= "0" &&characterToAdd String { вар stringWithAddedSpaces = "" пусть курсорПозицияВПространственнойСтроке = курсорПозиция для я в 0.. 0 && (i % 4) == 0 { stringWithAddedSpaces.append(" ") если я < курсорПозиционинспецелессстринг { курсорПозиция += 1 } } пусть символToAdd = строка[ string.index(string.startIndex, offsetBy: i) ] stringWithAddedSpaces.append(characterToAdd) } возвращаемая строкаWithAddedSpaces } } }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение