У меня две проблемы с пустым пространством.
У меня есть эта маска для кредитной карты: "[0000] [0000] [0000] [0000] [999]"
но основная проблема заключается в том, что когда пользователь заканчивает вводить обязательные числа, он по-прежнему говорит, что не завершено, потому что пользователь не ввел пробел перед [999]
. Как я могу исправить эту проблему?
У меня есть эта маска для ввода имени: [A…]
но она не позволяет мне вводить пробел, и, похоже, для этого нет символа. Я даже попытался создать свою собственную нотацию для пустого пространства, но безуспешно. Как я могу разрешить хотя бы одну букву и необязательные пробелы?
Спасибо за эту замечательную библиотеку!
Привет @caioremedio!
Спасибо за вопросы. Я уже вижу потенциальный запрос функции.
Во-первых , для вашей маски кредитной карты "[0000] [0000] [0000] [0000] [999]"
могут быть вашим ответом пользовательские обозначения. Вам понадобится дополнительный пробел, например:
"[0000] [0000] [0000] [0000][s][999]"
Notation(character: "s", characterSet: CharacterSet(charactersIn: " "), isOptional: true)
- попробуйте и дайте мне знать о ваших результатах.
Во-вторых , я заметил логическую ошибку в нашем Compiler
. Прямо сейчас наша библиотека пытается наследовать характеристики […]
зависимости от предыдущего символа, и она не поддерживает пользовательские обозначения для этого предыдущего символа (см. Ссылку).
Мне нужно обновить библиотеку для ваших нужд, хорошо?
Привет @taflanidi , спасибо за быстрый ответ.
Во-первых: я пробовал с [s]
но он не вставлял автоматически пробел. Я что-то здесь упускаю?
Я использую подкласс MaskedTextFieldDelegate
, я создал несколько пользовательских элементов для customNotations
:
class NotifyingMaskedTextFieldDelegate: MaskedTextFieldDelegate {
weak var editingListener: NotifyingMaskedTextFieldDelegateListener?
override init(format: String) {
super.init(format: format)
}
convenience init(format: String, customNotations: [Notation]) {
self.init(format: format)
self.customNotations = customNotations
}
convenience init(format: String, customNotation: Notation) {
self.init(format: format, customNotations: [customNotation])
}
}
Инициализация:
NotifyingMaskedTextFieldDelegate(
format: "[0000] [0000] [0000] [0000][s][999]",
customNotation: Notation(character: "s",
characterSet: CharacterSet(charactersIn: " "),
isOptional: true))
Во-вторых: хорошо, но можно ли включить в компилятор только пустое пространство (вместе с числами и буквами)?
Спасибо за поддержку.
Привет @caioremedio ,
Я пробовал использовать [s], но пробел не вставлялся автоматически. Я что-то здесь упускаю?
О, я забыл об этом. Я даже упомянул об этом в конце раздела ридми для пользовательских обозначений .
Я использую подкласс MaskedTextFieldDelegate, я создал несколько пользовательских элементов для customNotations
На самом деле вам не нужно создавать подклассы. MaskedTextFieldDelegate
имеет соответствующую общедоступную переменную customNotations
, и вы просто назначаете ей свой список обозначений.
Кроме того, теперь я вижу, что при таком подходе у вас возникнет еще одна проблема с извлеченным значением. Если быть точнее, это проблема: 1234123412341234 999
- ненужный пробел.
НО существует другой подход, который вы можете использовать для определения завершенности значения. Экземпляры Mask
и оболочка MaskedTextFieldDelegate
предоставляют ряд рассчитанных метрик для текста и извлеченного значения, например acceptableTextLength
, totalTextLength
и т. Д.
MaskedTextFieldDelegate.acceptableValueLength () вернет 16
в вашем случае, чтобы вы могли сравнить с ним длину извлеченного значения, чтобы определить, что ввод завершен.
Чтобы определить поведение, Compiler
необходимо знать природу предшествующего символа многоточия:
[A…]
^ this one defines, what symbols are accepted
На данный момент Compiler
ограничен базовым набором A a 0 9 - _
. Пользовательские обозначения не работают, когда дело доходит до эллиптических масок, это функция, которую необходимо реализовать.
О, я забыл об этом. Я даже упомянул об этом в конце раздела ридми для пользовательских обозначений.
Ой, бедно, этого не заметил.
На самом деле вам не нужно создавать подклассы. MaskedTextFieldDelegate имеет соответствующую общедоступную переменную customNotations, и вы просто назначаете ей свой список обозначений.
Нет, я создаю подклассы не только для пользовательской нотации, я использую другие подходы (переопределение методов UITextField
). Я просто прокомментировал это, потому что подумал, что автозаполнение не работает - это ошибка, поэтому я просто написал все, что делал.
MaskedTextFieldDelegate.acceptableValueLength () вернет 16 в вашем случае, поэтому вы можете сравнить длину извлеченного значения с ним, чтобы определить, что типизация завершена.
Потрясающе, работало как шарм. Поэтому вместо проверки completed == true
, теперь я должен полагаться на value.count > MaskedTextFieldDelegate.acceptableValueLength()
верно? Я тестировал здесь и, кажется, работает во всех случаях.
Пользовательские обозначения не работают, когда дело доходит до эллиптических масок, это функция, которую необходимо реализовать.
Попался. А пока для этого будем использовать UITextFieldDelegate
по умолчанию.
Чтобы определить поведение, компилятор должен знать природу предшествующего символа многоточия:
О, что я имею в виду, вместо того, чтобы реализовывать пользовательские обозначения (если требуется слишком много работы) с многоточием, просто реализуйте символ пробела.
Спасибо еще раз!
@caioremedio ,
Потрясающе, работало как шарм. Поэтому вместо проверки, завершено ли == true, теперь я должен полагаться на value.count> MaskedTextFieldDelegate.acceptableValueLength (), верно?
Ага.
О, что я имею в виду, вместо того, чтобы реализовывать пользовательские обозначения (если требуется слишком много работы) с многоточием, просто реализуйте символ пробела.
Фактически, использование здесь пользовательских обозначений потребует меньше усилий с нашей стороны.
Попался. А пока для этого воспользуемся UITextFieldDelegate по умолчанию.
Следите за обновлениями Compiler
эти выходные.
@caioremedio ,
Хорошо, теперь эллиптические маски также поддерживают пользовательские обозначения.
Ознакомьтесь с новейшими 3.4.1
.