Existe alguma maneira de detectar quando a tecla Backspace/ Deleteé pressionada no teclado do iPhone em um UITextField
que está vazio? Quero saber quando Backspaceé pressionado apenas se o UITextField
estiver vazio.
Com base na sugestão de @Alex Reynolds em um comentário, adicionamos o seguinte código ao criar meu campo de texto:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleTextFieldChanged:)
name:UITextFieldTextDidChangeNotification
object:searchTextField];
Essa notificação é recebida (a handleTextFieldChanged
função é chamada), mas ainda não é quando pressiono a Backspacetecla em um campo vazio. Alguma ideia?
Parece haver alguma confusão em torno dessa questão. Quero receber uma notificação quando a Backspacetecla for pressionada. É isso aí. Mas a solução também deve funcionar quando a UITextField
já estiver vazia.
ios
iphone
uitextfield
backspace
marcc
fonte
fonte
Respostas:
Isso pode ser um tiro no escuro, mas pode funcionar. Tente definir o texto do campo de texto como um caractere de espaço com largura zero
\u200B
. Quando o backspace é pressionado em um campo de texto que parece vazio, na verdade ele exclui seu espaço. Então você pode apenas reinserir o espaço.Pode não funcionar se o usuário conseguir mover o cursor para a esquerda do espaço.
fonte
UITextField
e implementarcanPerformAction:withSender:
areturn NO
paraselect:
eselectAll:
ações quando o texto é igual à cadeia@"\u200B"
.Swift 4:
Subclasse
UITextField
:Implementação:
Objetivo-C:
Subclasse
UITextField
:Agora basta adicionar MyTextFieldDelegate ao seu
UIViewController
e defina seuUITextFields
myDelegate comoself
:fonte
ViewController
classe se eu definir delegado do meu campo de texto para subclasse deUITextField
, em vez deUIViewController
deleteBackward()
não será chamado se vocêreturn false
textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
Atualização: Veja a resposta de JacobCaraballo para um exemplo que substitui
-[UITextField deleteBackward]
.Confira
UITextInput
, especificamente,UIKeyInput
tem umdeleteBackward
método delegado que sempre é chamado quando a tecla Delete é pressionada. Se você estiver fazendo algo simples, considere apenas subclassificarUILabel
e torná-lo em conformidade com oUIKeyInput
protocolo, conforme feito por SimpleTextInput e por este exemplo de UIKeyInput do iPhone . Nota:UITextInput
e seus parentes (inclusiveUIKeyInput
) estão disponíveis apenas no iOS 3.2 e posterior.fonte
Código como a seguir:
Por fim, esqueça de alterar a propriedade Custom Class do campo de texto para "MyTextField"
fonte
Implementação rápida:
fonte
Eu fundei de outra maneira mais fácil do que
subclass
solução. Mesmo um pouco estranho, mas funciona bem.É um pouco estranho, pois o resultado da comparação é -8. Talvez eu esteja errado em algum momento
C Programming
. Mas o seu trabalho certo;)fonte
strcmp
devoluções-1, 0, or 1
? Essa foi a minha compreensão.UITextViewDelegate
método, nãoUITextFieldDelegate
.Tente o
delegate
Em seguida, verifique se o
range.length == 1
que parece ser o caso quandobackspace
é atingido.fonte
use o código abaixo para ajudá-lo a detectar a tecla de exclusão do teclado, mesmo se o campo de texto estiver vazio.
Objetivo C:
- (BOOL)keyboardInputShouldDelete:(UITextField *)textField { return YES; }
Rápido :
fonte
A resposta de Niklas Alvaeus me ajudou com um problema semelhante
Eu estava limitando a entrada para um conjunto de caracteres específico, mas estava ignorando os backspaces. Então eu tive que verificar
range.length == 1
antes de aparar oNSString
. Se for verdade, eu apenas retorno a string e não a corto. Ver abaixofonte
Para quem tem problemas com a resposta de Jacob, implementei minha subclasse de campo de texto da seguinte maneira e funciona muito bem!
fonte
Sim, use o método abaixo para detectar backspace, quando textField estiver vazio.
Precisa adicionar UITextFieldDelegate
yourTextField.delegate = self (DEVE NECESSÁRIO)
Rápido:
Objetivo C:
fonte
O melhor uso que encontrei para detectar o backspace é detectar quando o usuário pressionou o backspace em um vazio
UITextField
. Por exemplo, se você tiver 'borbulhado' nos destinatários do aplicativo de email, ao pressionar backspace noUITextField
, ele selecionará o último destinatário 'borbulhado'.Isso pode ser feito de maneira semelhante à resposta de Jacob Caraballo. Mas na resposta de Jacob, se
UITextField
houver um caractere quando você pressionar backspace, no momento em que a mensagem do delegado for recebida,UITextField
ela já estará vazia, então você estará efetivamente detectandobackspace
em um campo de texto com no máximo um caractere.Na verdade, se você deseja detectar
backspace
em umUITextField
com exatamente zero caracteres (vazio), envie a mensagem paradelegate
antes da chamadasuper deleteBackward
. Por exemplo:A interface para esse campo de texto seria algo como isto:
fonte
No iOS 6, o método deleteBackward é chamado no UITextField quando o backspace é pressionado, inclusive quando o campo está vazio. Assim, você pode subclassificar UITextField e fornecer sua própria implementação deleteBackward (invocando super's também.)
Ainda estou suportando o iOS 5, portanto, precisarei de uma combinação da resposta de Andrew e isso.
fonte
:) apenas para o título "Detectar backspace", onde eu uso
UIKeyboardTypeNumberPad
.Também encontro a mesma pergunta hoje à noite, e a seguir está o meu código para descobrir:
Como com
UIKeyboardTypeNumberPad
, o usuário pode inserir apenas Number ou backspace; portanto, quando o comprimento da string for 0, ele deverá ser a chave de backspace.Espero que o acima faça alguma ajuda.
fonte
Em vez de tentar pré-construir o que VAI SER no campo de texto ou descobrir qual caractere especial foi inserido no
shouldChangeCharactersInRange
método, sugiro fazer o seguinte:Isso permite que você chame um método diretamente após a conclusão da operação atual. O que é interessante sobre isso é que, quando terminar, o valor modificado já estará no
UITextField
. Nesse ponto, você pode apenas verificar seu comprimento e / ou validar com base no que está lá.fonte
Subclassificar UITextField não funcionou para mim no iOS 8.3, deleteBackward nunca foi chamado.
Aqui está a solução que usei, funciona em todas as versões do iOS 8 e também em outras versões do iOS
fonte
No arquivo .h, adicione o delegado UIKeyInput
Formatação aprimorada
fonte
Eu implementei a solução semelhante com pequenas melhorias que me dirão que, se o campo de texto tiver algum valor enquanto o usuário tocar no backspace. Isso é útil para o meu caso, quando devo focar apenas em outro campo de texto se o campo de texto estiver vazio quando o backspace for pressionado.
fonte
A resposta mais poplar está faltando uma coisa - a capacidade de detectar se o campo de texto estava vazio ou não.
Ou seja, quando você substitui o método deleteBackwards () de uma subclasse TextField, ainda não sabe se o campo de texto já estava vazio. (Antes e depois de deleteBackwards (),
textField.text!
é uma sequência vazia:""
)Aqui está a minha melhoria, com uma verificação do vazio antes da exclusão.
1. Crie um protocolo de delegação que estenda UITextFieldDelegate
2. Subclasse UITextField
3. Implemente seu novo protocolo de delegação
fonte
Manipulador abrangente para campo de texto com número de um dígito para o Swift 5.1 :
1 passo
2 Etapa
3 Etapa
fonte
Aqui minha solução baseada na idéia @andrew:
em algum lugar, por exemplo, em viewDidLoad
e depois
fonte
Você pode verificar o texto da visualização / campo de texto para ver se está vazio e garantir que o texto de substituição também esteja vazio no método delegado shouldChangeTextIn.
fonte
Algo assim:
é claro que o hash é para uma sequência de caracteres.
fonte
Usando o método TextField Delegate:
Adicione o seguinte código no método acima para detectar o evento de exclusão
fonte
Para simplificar, aqui está a única condição que você precisa verificar
fonte
fonte
Em
UITextViewDelegate
:funciona bem para mim.
atualização para pinyin simplificado chinês e entrada de caligrafia chinesa:
base no documento diz:
"Se o usuário pressionar o
deleteKey
, o comprimento do intervalo será 1 e um objeto de string vazio substituirá esse caractere único."fonte
UITextField
, nãoUITextView
.