Input-mask-ios: Проблемы с пустым пространством

Созданный на 24 мая 2018  ·  6Комментарии  ·  Источник: RedMadRobot/input-mask-ios

У меня две проблемы с пустым пространством.

  1. У меня есть эта маска для кредитной карты: "[0000] [0000] [0000] [0000] [999]" но основная проблема заключается в том, что когда пользователь заканчивает вводить обязательные числа, он по-прежнему говорит, что не завершено, потому что пользователь не ввел пробел перед [999] . Как я могу исправить эту проблему?

  2. У меня есть эта маска для ввода имени: [A…] но она не позволяет мне вводить пробел, и, похоже, для этого нет символа. Я даже попытался создать свою собственную нотацию для пустого пространства, но безуспешно. Как я могу разрешить хотя бы одну букву и необязательные пробелы?

Спасибо за эту замечательную библиотеку!

feature request question

Все 6 Комментарий

Привет @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 в вашем случае, чтобы вы могли сравнить с ним длину извлеченного значения, чтобы определить, что ввод завершен.


  1. > Хорошо, но можно ли включить в компилятор только пустое пространство (вместе с числами и буквами)?

Чтобы определить поведение, 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 .

Была ли эта страница полезной?
0 / 5 - 0 рейтинги