Я хочу написать собственное TextField в SwiftUI, чтобы иметь ввод с форматом кредитной карты, например этот «xxxx-xxxx-xxxx-xxxx», я смотрел на эти ответы https://stackoverflow.com/a/48252437, но я борюсь с UIViewRepresentable, когда я хочу вставить числа в исходный текст, он, похоже, не обновляет его в соответствии с форматом.
TextField покажет тебе 12345, а мне нужно 1234 5
struct ContentView: View {
@State var cardNumber: String = "12345" // Coordinator {
Coordinator($number)
}
// MARK: Coordinator
public class Coordinator: NSObject, UITextFieldDelegate {
@Binding var number: String
private var previousTextFieldContent: String?
private var previousSelection: UITextRange?
init(_ number: Binding) {
self._number = number
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
previousTextFieldContent = textField.text
previousSelection = textField.selectedTextRange
return true
}
@objc func reformatAsCardNumber(textField: UITextField, for event: UIControl.Event) {
var targetCursorPosition = 0
if let startPosition = textField.selectedTextRange?.start {
targetCursorPosition = textField.offset(from: textField.beginningOfDocument, to: startPosition)
}
var cardNumberWithoutSpaces = ""
if let text = textField.text {
cardNumberWithoutSpaces = self.removeNonDigits(string: text, andPreserveCursorPosition: &targetCursorPosition)
}
if cardNumberWithoutSpaces.count > 16 {
textField.text = previousTextFieldContent
textField.selectedTextRange = previousSelection
return
}
let cardNumberWithSpaces = self.insertCreditCardSpaces(cardNumberWithoutSpaces, preserveCursorPosition: &targetCursorPosition)
textField.text = cardNumberWithSpaces
number = cardNumberWithSpaces
if let targetPosition = textField.position(from: textField.beginningOfDocument, offset: targetCursorPosition) {
textField.selectedTextRange = textField.textRange(from: targetPosition, to: targetPosition)
}
}
func removeNonDigits(string: String, andPreserveCursorPosition cursorPosition: inout Int) -> String {
var digitsOnlyString = ""
let originalCursorPosition = cursorPosition
for i in Swift.stride(from: 0, to: string.count, by: 1) {
let characterToAdd = string[string.index(string.startIndex, offsetBy: i)]
if characterToAdd >= "0" && characterToAdd String {
var stringWithAddedSpaces = ""
let cursorPositionInSpacelessString = cursorPosition
for i in 0.. 0 && (i % 4) == 0 {
stringWithAddedSpaces.append(" ")
if i < cursorPositionInSpacelessString {
cursorPosition += 1
}
}
let characterToAdd = string[
string.index(string.startIndex, offsetBy: i)
]
stringWithAddedSpaces.append(characterToAdd)
}
return stringWithAddedSpaces
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/763 ... -xxxx-xxxx
Текстовое поле форматирования SwiftUI для ввода кредитной карты «xxxx-xxxx-xxxx-xxxx» ⇐ IOS
Программируем под IOS
1764504435
Anonymous
Я хочу написать собственное TextField в SwiftUI, чтобы иметь ввод с форматом кредитной карты, например этот «xxxx-xxxx-xxxx-xxxx», я смотрел на эти ответы https://stackoverflow.com/a/48252437, но я борюсь с UIViewRepresentable, когда я хочу вставить числа в исходный текст, он, похоже, не обновляет его в соответствии с форматом.
TextField покажет тебе [b]12345[/b], а мне нужно [b]1234 5[/b]
struct ContentView: View {
@State var cardNumber: String = "12345" // Coordinator {
Coordinator($number)
}
// MARK: Coordinator
public class Coordinator: NSObject, UITextFieldDelegate {
@Binding var number: String
private var previousTextFieldContent: String?
private var previousSelection: UITextRange?
init(_ number: Binding) {
self._number = number
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
previousTextFieldContent = textField.text
previousSelection = textField.selectedTextRange
return true
}
@objc func reformatAsCardNumber(textField: UITextField, for event: UIControl.Event) {
var targetCursorPosition = 0
if let startPosition = textField.selectedTextRange?.start {
targetCursorPosition = textField.offset(from: textField.beginningOfDocument, to: startPosition)
}
var cardNumberWithoutSpaces = ""
if let text = textField.text {
cardNumberWithoutSpaces = self.removeNonDigits(string: text, andPreserveCursorPosition: &targetCursorPosition)
}
if cardNumberWithoutSpaces.count > 16 {
textField.text = previousTextFieldContent
textField.selectedTextRange = previousSelection
return
}
let cardNumberWithSpaces = self.insertCreditCardSpaces(cardNumberWithoutSpaces, preserveCursorPosition: &targetCursorPosition)
textField.text = cardNumberWithSpaces
number = cardNumberWithSpaces
if let targetPosition = textField.position(from: textField.beginningOfDocument, offset: targetCursorPosition) {
textField.selectedTextRange = textField.textRange(from: targetPosition, to: targetPosition)
}
}
func removeNonDigits(string: String, andPreserveCursorPosition cursorPosition: inout Int) -> String {
var digitsOnlyString = ""
let originalCursorPosition = cursorPosition
for i in Swift.stride(from: 0, to: string.count, by: 1) {
let characterToAdd = string[string.index(string.startIndex, offsetBy: i)]
if characterToAdd >= "0" && characterToAdd String {
var stringWithAddedSpaces = ""
let cursorPositionInSpacelessString = cursorPosition
for i in 0.. 0 && (i % 4) == 0 {
stringWithAddedSpaces.append(" ")
if i < cursorPositionInSpacelessString {
cursorPosition += 1
}
}
let characterToAdd = string[
string.index(string.startIndex, offsetBy: i)
]
stringWithAddedSpaces.append(characterToAdd)
}
return stringWithAddedSpaces
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/76395570/swiftui-formatting-textfield-for-credit-card-input-xxxx-xxxx-xxxx-xxxx[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия