¿Hay alguna forma de detectar cuando se presiona la tecla Backspace/ Deleteen el teclado del iPhone en un dispositivo UITextField
que está vacío? Quiero saber cuándo Backspacese presiona solo si UITextField
está vacío.
Según la sugerencia de @Alex Reynolds en un comentario, agregué el siguiente código al crear mi campo de texto:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleTextFieldChanged:)
name:UITextFieldTextDidChangeNotification
object:searchTextField];
Esta notificación se recibe ( handleTextFieldChanged
se llama a la función), pero aún no cuando presiono la Backspacetecla en un campo vacío. ¿Algunas ideas?
Parece haber cierta confusión en torno a esta pregunta. Quiero recibir una notificación cuando Backspacese presiona la tecla. Eso es. Pero la solución también debe funcionar cuando UITextField
ya está vacío.
ios
iphone
uitextfield
backspace
marcc
fuente
fuente
Respuestas:
Esto puede ser una posibilidad remota, pero podría funcionar. Intente establecer el texto del campo de texto en un carácter de espacio de ancho cero
\u200B
. Cuando se presiona la tecla de retroceso en un campo de texto que aparece vacío, en realidad eliminará su espacio. Entonces puedes reinsertar el espacio.Puede no funcionar si el usuario logra mover el cursor a la izquierda del espacio.
fuente
UITextField
y aplicarcanPerformAction:withSender:
areturn NO
paraselect:
yselectAll:
acciones cuando el texto es igual a la cadena@"\u200B"
.Swift 4:
Subclase
UITextField
:Implementación:
C objetivo:
Subclase
UITextField
:Ahora simplemente agregue MyTextFieldDelegate a su
UIViewController
y configure suUITextFields
myDelegate enself
:fuente
ViewController
clase si configuro el delegado de mi campo de texto en una subclase de enUITextField
lugar de?UIViewController
deleteBackward()
no se llamará sireturn false
entextField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
Actualización: Vea la respuesta de JacobCaraballo para un ejemplo que anula
-[UITextField deleteBackward]
.Echa un vistazo
UITextInput
, específicamenteUIKeyInput
tiene undeleteBackward
método de delegado que siempre se llama cuando se presiona la tecla Eliminar. Si está haciendo algo simple, entonces podría considerar simplemente subclasificarUILabel
y hacer que se ajuste alUIKeyInput
protocolo, como lo hace SimpleTextInput y este ejemplo de iPhone UIKeyInput . Nota:UITextInput
y sus parientes (incluidosUIKeyInput
) solo están disponibles en iOS 3.2 y versiones posteriores.fuente
Código como el siguiente:
Por último, olvide cambiar la propiedad de Clase personalizada del campo de texto a "MyTextField"
fuente
Implementación rápida:
fuente
He encontrado otra manera más fácil que la
subclass
solución. Incluso es un poco extraño, pero funciona bien.Es un poco extraño porque el resultado de la comparación es -8. Tal vez me equivoque en algún punto de
C Programming
. Pero es el trabajo correcto;)fuente
strcmp
devoluciones tampoco-1, 0, or 1
? Ese fue mi entendimiento.UITextViewDelegate
método, noUITextFieldDelegate
.Prueba el
delegate
Luego, compruebe si
range.length == 1
parece ser el caso cuandobackspace
se golpea.fuente
utilice el siguiente código, lo ayudará a detectar la tecla de eliminación del teclado incluso si el campo de texto está vacío.
C objetivo :
- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { return YES; }
Rápido:
fuente
La respuesta de Niklas Alvaeus me ayudó con un problema similar
Estaba limitando la entrada a un conjunto de caracteres específico, pero ignoraba los espacios de retroceso. Así que lo revisé
range.length == 1
antes de recortarloNSString
. Si es cierto, solo devuelvo la cadena y no la recorto. Vea abajofuente
Para los que tienen problemas con la respuesta de Jacob, implementé mi subclase de campo de texto de la siguiente manera y funciona muy bien.
fuente
Sí, utilice el siguiente método para detectar retroceso, cuando textField esté vacío.
Necesita agregar UITextFieldDelegate
yourTextField.delegate = self (DEBE REQUERIRSE)
Rápido:
C objetivo:
fuente
El mejor uso que he encontrado para detectar el retroceso es detectar cuándo el usuario ha presionado el retroceso en un espacio vacío
UITextField
. Por ejemplo, si ha "burbujeado" destinatarios en la aplicación de correo, cuando presiona la tecla de retroceso en elUITextField
, selecciona el último destinatario 'burbujeado'.Esto se puede hacer de manera similar a la respuesta de Jacob Caraballo. Pero en la respuesta de Jacob, si
UITextField
le queda un carácter al presionar la tecla de retroceso, para cuando se reciba el mensaje del delegado, el mensajeUITextField
ya estará vacío, por lo que está detectando efectivamentebackspace
en un campo de texto con un máximo de caracteres.En realidad, si desea detectar
backspace
en unUITextField
con exactamente cero caracteres (vacío), debe enviar el mensajedelegate
antes de la llamadasuper deleteBackward
. Por ejemplo:La interfaz para dicho campo de texto se vería así:
fuente
En iOS 6, el método deleteBackward se llama en UITextField cuando se presiona la tecla de retroceso, incluso cuando el campo está vacío. Por lo tanto, puede subclasificar UITextField y proporcionar su propia implementación deleteBackward (invocando super's también).
Sin embargo, todavía soporto iOS 5, así que necesitaré una combinación de la respuesta de Andrew y esto.
fuente
:) solo por el título "Detectar retroceso", donde uso
UIKeyboardTypeNumberPad
.También me encuentro con la misma pregunta esta noche, y el siguiente es mi código para averiguarlo:
Porque con
UIKeyboardTypeNumberPad
, el usuario solo puede ingresar Número o retroceso, por lo que cuando la longitud de la cadena es 0, debe ser la tecla de retroceso.Espero que lo anterior ayude un poco.
fuente
En lugar de intentar preconstruir lo que SERÁ en el campo de texto o averiguar qué carácter especial se ha ingresado en el
shouldChangeCharactersInRange
método, sugeriría hacer lo siguiente:Esto le permite llamar a un método directamente después de que se complete la operación actual. Lo bueno de esto es que, para cuando se complete, el valor modificado ya estará en
UITextField
. En ese punto, puede verificar su longitud y / o validar en función de lo que hay allí.fuente
Subclasificar UITextField no funcionó para mí en iOS 8.3, nunca se llamó a deleteBackward.
Aquí está la solución que utilicé, funciona en todas las versiones de iOS 8 y debería funcionar también en otras versiones de iOS
fuente
En el archivo .h, agregue el delegado UIKeyInput
Formato mejorado
fuente
He implementado una solución similar con mejoras menores que me dirán que si el campo de texto tiene algún valor mientras el usuario ha pulsado el espacio de retroceso. Esto es útil para mi caso cuando solo debería centrarme en otro campo de texto si el campo de texto está vacío cuando se presiona la tecla de retroceso.
fuente
A la respuesta más popular le falta una cosa: la capacidad de detectar si el campo de texto estaba vacío o no.
Es decir, cuando anula el método deleteBackwards () de una subclase TextField, aún no sabe si el campo de texto ya estaba vacío. (Tanto antes como después de deleteBackwards (),
textField.text!
es una cadena vacía:""
)Aquí está mi mejora, con un control de vacío antes de la eliminación.
1. Cree un protocolo delegado que extienda UITextFieldDelegate
2. Subclase UITextField
3. Implemente su nuevo protocolo de delegado
fuente
Controlador completo para el campo de texto con un número de un solo dígito para Swift 5.1 :
1 paso
2 pasos
Paso 3
fuente
Aquí mi solución basada en la idea de @andrew:
en algún lugar, por ejemplo en viewDidLoad
y entonces
fuente
Puede verificar el texto de la vista / campo de texto para ver si está vacío y asegurarse de que el texto de reemplazo también esté vacío en el método de delegado shouldChangeTextIn.
fuente
Algo como esto:
Por supuesto, el hash es para una cadena de caracteres.
fuente
Usando el método Delegado TextField:
Agregue el siguiente código en el método anterior para detectar el evento de eliminación
fuente
Para mantenerlo simple, esta es la única condición que debe verificar
fuente
fuente
En
UITextViewDelegate
:funciona bien para mi
actualización para pinyin chino simplificado y entrada de escritura china:
base en el documento dice:
"Si el usuario presiona
deleteKey
, la longitud del rango es 1 y un objeto de cadena vacío reemplaza ese carácter individual".fuente
UITextField
, noUITextView
.