Вот еще один ответ для вас.Вы должны реализовать UITextFieldDelegate
и установить делегат textField
как self
.Затем реализуйте приведенный ниже метод делегата.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text, let textRange = Range(range, in: text) else {
return false
}
var updatedText = text.replacingCharacters(in: textRange, with: string)
updatedText.removeAll(where: {$0 == ":"})
let finalLength = updatedText.count + updatedText.count/2 - 1
if finalLength > 17 {
return false
}
for i in stride(from: 2, to: finalLength, by: 3) {
let index = updatedText.index(updatedText.startIndex, offsetBy: i)
updatedText.insert(":", at: index)
}
textField.text = updatedText
return false
}
Логика здесь действительно проста для понимания:
- Снимите строку со всех «:», которые вы, возможно, вставили в прошлый раз.
- Вставьте «:» в каждую 3-ю позицию в строке и установите строку вручную в
shouldChangeCharacters
Вы должны включить другую логику, такую как ограничение символов, ограничения символов, копирование-паста обрабатывает себя.Ответ сфокусирован только на логике, связанной с добавлением и удалением «:»
Вам не нужно удалять «:», который вставляется при удалении символов .Например: если у вас есть «45: D» и вы нажимаете удалить один раз, у вас останется «45», а не «45:».