Input-mask-ios: Problemas de espacio en blanco

Creado en 24 may. 2018  ·  6Comentarios  ·  Fuente: RedMadRobot/input-mask-ios

Me enfrento a dos problemas relacionados con el espacio en blanco.

  1. Tengo esta máscara para tarjeta de crédito: "[0000] [0000] [0000] [0000] [999]" pero el problema principal es que cuando el usuario termina de escribir los números obligatorios, todavía dice que no está completo porque el usuario no escribió el espacio en blanco antes de [999] . ¿Cómo puedo solucionar este problema?

  2. Tengo esta máscara para ingresar el nombre: [A…] pero no me permite ingresar un espacio en blanco, y parece que no hay un símbolo para eso. Incluso intenté crear mi notación personalizada para espacios en blanco, pero no tuve éxito. ¿Cómo puedo permitir al menos una letra y espacios en blanco opcionales?

¡Gracias por esta increíble biblioteca!

feature request question

Todos 6 comentarios

¡Hola @caioremedio!
Gracias por tus preguntas. Ya veo una posible solicitud de función.

Primero , para su máscara de tarjeta de crédito "[0000] [0000] [0000] [0000] [999]" las anotaciones personalizadas pueden ser su respuesta. Necesita un carácter de espacio opcional, como este:

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

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

—Por favor, pruébelo y déjeme saber sus resultados.

En segundo lugar , noté una falla lógica en nuestro Compiler . En este momento, nuestra biblioteca intenta heredar características de […] dependiendo del carácter anterior, y no admite notaciones personalizadas para este carácter anterior (ver el enlace).

Necesitaré actualizar la biblioteca para sus necesidades, ¿de acuerdo?

Hola @taflanidi , gracias por una respuesta rápida.

Primero: lo intenté con [s] pero no inserta automáticamente el carácter de espacio en blanco. ¿Me estoy perdiendo algo aquí?

Estoy usando la subclase de MaskedTextFieldDelegate , creé algunos 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: De acuerdo, pero ¿es posible incluir solo espacios en blanco en el compilador (junto con números y letras)?

Gracias por el apoyo.

Hola @caioremedio ,

Intenté con [s] pero no inserta automáticamente un carácter de espacio en blanco. ¿Me estoy perdiendo algo aquí?

Oh, me olvidé de eso. Incluso lo mencioné al final de la sección Léame de notaciones personalizadas .

Estoy usando la subclase de MaskedTextFieldDelegate, creé algunos inits personalizados para customNotations

En realidad, no es necesario realizar una subclase. MaskedTextFieldDelegate tiene una variable pública correspondiente customNotations , y usted simplemente le asigna su lista de notaciones.

Además, ahora veo que con este enfoque obtendrá otro problema con el valor extraído. Para ser específico, este problema: 1234123412341234 999 - un espacio innecesario.

PERO existe otro enfoque que puede incorporar para definir que el valor está completo. Mask instancias y el contenedor MaskedTextFieldDelegate proporcionan una serie de métricas calculadas para el texto y para el valor extraído, como acceptableTextLength , totalTextLength , etc.

MaskedTextFieldDelegate.acceptableValueLength () devolverá 16 en su caso, por lo que podría comparar la longitud del valor extraído con él para definir que se completa la escritura.


  1. > Muy bien, pero ¿es posible incluir solo espacios en blanco en el compilador (junto con números y letras)?

Para definir el comportamiento, Compiler necesita conocer la naturaleza de los puntos suspensivos que preceden al carácter:

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

Por ahora, Compiler está limitado al conjunto básico de A a 0 9 - _ . Las notaciones personalizadas no funcionan cuando se trata de máscaras elípticas, esta es una característica que debe implementarse.

Oh, me olvidé de eso. Incluso lo mencioné al final de la sección Léame de notaciones personalizadas.

Oh, mi mal, no me di cuenta de eso.

En realidad, no es necesario realizar una subclase. MaskedTextFieldDelegate tiene una variable pública customNotations correspondiente, y usted simplemente le asigna su lista de notaciones.

No, no estoy subclasificando solo para notación personalizada, estoy usando para otros enfoques (anulando UITextField métodos). Acabo de comentar eso porque pensé que la finalización automática no funcionaba era un error, así que escribí todo lo que estaba haciendo.

MaskedTextFieldDelegate.acceptableValueLength () devolverá 16 en su caso, por lo que podría comparar la longitud del valor extraído con él para definir que se completa la escritura.

Impresionante, funcionó a las mil maravillas. Entonces, en lugar de verificar si completed == true , ahora debería confiar en value.count > MaskedTextFieldDelegate.acceptableValueLength() ¿verdad? Probé aquí y parece funcionar en todos los casos.

Las notaciones personalizadas no funcionan cuando se trata de máscaras elípticas, esta es una característica que debe implementarse.

Entendido. Mientras tanto, usaré el valor predeterminado UITextFieldDelegate para eso.

Para definir el comportamiento, el compilador necesita conocer la naturaleza de los puntos suspensivos que preceden al carácter:

Oh, lo que quiero decir es que, en lugar de implementar notaciones personalizadas (si requiere demasiado trabajo) con puntos suspensivos, simplemente implemente el carácter de espacio en blanco.

¡Gracias de nuevo!

@caioremedio ,

Impresionante, funcionó a las mil maravillas. Entonces, en lugar de verificar si se completó == verdadero, ahora debería confiar en value.count> MaskedTextFieldDelegate.acceptableValueLength () ¿verdad?

Sí.

Oh, lo que quiero decir es que, en lugar de implementar notaciones personalizadas (si requiere demasiado trabajo) con puntos suspensivos, simplemente implemente el carácter de espacio en blanco.

De hecho, el uso de notaciones personalizadas aquí requeriría menos trabajo de nuestra parte.

Entendido. Mientras tanto, usaré UITextFieldDelegate predeterminado para eso.

Estén atentos a las actualizaciones de Compiler este fin de semana.

@caioremedio ,

Muy bien, ahora las máscaras elípticas también admiten anotaciones personalizadas.

Echa un vistazo a los 3.4.1 más nuevos.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

osterlind picture osterlind  ·  3Comentarios

beltik picture beltik  ·  6Comentarios

DamascenoRafael picture DamascenoRafael  ·  4Comentarios

TikhonovAlexander picture TikhonovAlexander  ·  3Comentarios

razalur picture razalur  ·  3Comentarios