Input-mask-ios: Problemas de espaço em branco

Criado em 24 mai. 2018  ·  6Comentários  ·  Fonte: RedMadRobot/input-mask-ios

Estou enfrentando dois problemas com relação ao espaço em branco.

  1. Eu tenho esta máscara para cartão de crédito: "[0000] [0000] [0000] [0000] [999]" mas o principal problema é quando o usuário termina de digitar os números obrigatórios, ainda diz que não foi preenchido porque o usuário não digitou o espaço em branco antes de [999] . Como posso corrigir esse problema?

  2. Eu tenho esta máscara para entrada de nome: [A…] mas ela não me permite inserir um espaço em branco e parece que não há nenhum símbolo para isso. Eu até tentei criar minha notação personalizada para espaços em branco, mas sem sucesso. Como posso permitir pelo menos uma letra e espaços em branco opcionais?

Obrigado por esta biblioteca incrível!

feature request question

Todos 6 comentários

Olá @caioremedio!
Obrigado por suas perguntas. Já vejo uma possível solicitação de recurso.

Primeiro , para sua "[0000] [0000] [0000] [0000] [999]" máscara de cartão de crédito, notações personalizadas podem ser sua resposta. Você precisa de um caractere de espaço opcional, como este:

"[0000] [0000] [0000] [0000][s][999]"

Notation(character: "s", characterSet: CharacterSet(charactersIn: " "), isOptional: true)

—Por favor, experimente e deixe-me saber seus resultados.

Em segundo lugar , percebi uma falha lógica em nosso Compiler . No momento, nossa biblioteca tenta herdar características de […] dependendo do caractere anterior, e não suporta notações personalizadas para este caractere anterior (veja o link).

Vou precisar atualizar a biblioteca para suas necessidades, ok?

Olá @taflanidi , obrigado pela resposta rápida.

Primeiro: tentei com [s] mas não é a inserção automática do caractere de espaço em branco. Estou faltando alguma coisa aqui?

Estou usando a subclasse de MaskedTextFieldDelegate , criei alguns inits personalizados para 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])
    }
}

Inicializando:

NotifyingMaskedTextFieldDelegate(
    format: "[0000] [0000] [0000] [0000][s][999]",
    customNotation: Notation(character: "s",
                             characterSet: CharacterSet(charactersIn: " "),
                             isOptional: true))

Segundo: Tudo bem, mas é possível incluir apenas espaços em branco no Compilador (junto com Números e Letras)?

Obrigado pelo apoio.

Olá @caioremedio ,

Tentei com [s], mas não é a inserção automática de um caractere de espaço em branco. Estou faltando alguma coisa aqui?

Oh, eu esqueci disso. Eu até mencionei isso no final da seção Leiame de notações personalizadas .

Estou usando a subclasse de MaskedTextFieldDelegate, criei alguns inits personalizados para customNotations

Você não precisa criar uma subclasse, na verdade. MaskedTextFieldDelegate tem uma variável pública correspondente customNotations , e você apenas atribui sua lista de notações a ela.

Além disso, agora vejo que com essa abordagem você terá outro problema com o valor extraído. Para ser mais específico, este problema: 1234123412341234 999 - um espaço desnecessário.

MAS existe uma outra abordagem que você pode incorporar para definir se o valor está completo. Mask instâncias e o wrapper MaskedTextFieldDelegate fornecem uma série de métricas calculadas para o texto e para o valor extraído, como acceptableTextLength , totalTextLength , etc.

MaskedTextFieldDelegate.acceptableValueLength () retornará 16 no seu caso, então você pode comparar o comprimento do valor extraído a ele para definir que a digitação está concluída.


  1. > Tudo bem, mas é possível incluir apenas espaços em branco no compilador (junto com números e letras)?

Para definir o comportamento, Compiler precisa saber a natureza das reticências que precedem o caractere:

[A…]
 ^ this one defines, what symbols are accepted

Por enquanto, Compiler está limitado ao conjunto básico de A a 0 9 - _ . As notações personalizadas não funcionam quando se trata de máscaras elípticas, esse é um recurso a ser implementado.

Oh, eu esqueci disso. Eu até mencionei isso no final da seção Leiame de notações personalizadas.

Oh meu mal, não notei isso.

Você não precisa criar uma subclasse, na verdade. MaskedTextFieldDelegate tem uma variável pública correspondente customNotations, e você apenas atribui sua lista de notações a ela.

Não, não estou criando subclasses apenas para notação personalizada, estou usando para outras abordagens (substituindo UITextField métodos). Acabei de comentar isso porque pensei que o preenchimento automático não estava funcionando era um bug, então escrevi tudo o que estava fazendo.

MaskedTextFieldDelegate.acceptableValueLength () retornará 16 no seu caso, para que você possa comparar o comprimento do valor extraído a ele para definir que a digitação está concluída.

Incrível, funcionou como um encanto. Portanto, em vez de verificar se completed == true , agora devo confiar em value.count > MaskedTextFieldDelegate.acceptableValueLength() certo? Eu testei aqui e parece funcionar em todos os casos.

As notações personalizadas não funcionam quando se trata de máscaras elípticas, esse é um recurso a ser implementado.

Peguei vocês. Nesse ínterim, vou usar UITextFieldDelegate padrão para isso.

Para definir o comportamento, o compilador precisa saber a natureza das reticências que precedem o caractere:

Oh, o que quero dizer é que, em vez de implementar notações personalizadas (se der muito trabalho) com reticências, apenas implemente o caractere de espaço em branco.

Obrigado novamente!

@caioremedio ,

Incrível, funcionou como um encanto. Portanto, em vez de verificar se concluído == verdadeiro, agora devo confiar em value.count> MaskedTextFieldDelegate.acceptableValueLength () certo?

Sim.

Oh, o que quero dizer é que, em vez de implementar notações personalizadas (se der muito trabalho) com reticências, apenas implemente o caractere de espaço em branco.

Na verdade, o uso de notações personalizadas aqui exigiria menos trabalho da nossa parte.

Peguei vocês. Enquanto isso, vou usar UITextFieldDelegate padrão para isso.

Fique ligado nas atualizações de Compiler neste fim de semana.

@caioremedio ,

Muito bem, agora as máscaras elípticas também suportam notações personalizadas.

Confira o mais recente 3.4.1 .

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Robuske picture Robuske  ·  4Comentários

razalur picture razalur  ·  3Comentários

KompoD picture KompoD  ·  5Comentários

MrJox picture MrJox  ·  11Comentários

DamascenoRafael picture DamascenoRafael  ·  4Comentários