Eu estou querendo saber como fazer o teclado desaparecer quando o usuário toca fora de um UITextField
.
ios
cocoa-touch
uitextfield
uikit
jonepatr
fonte
fonte
Respostas:
Você precisará adicionar um
UITapGestureRecogniser
e atribuí-lo à visualização e, em seguida, ligar para o primeiro atendedor de demissãoUITextField
no seletor.O código:
In viewDidLoad
Em dispensKeyboard:
(Onde
aTextField
é o campo de texto responsável pelo teclado)A versão Swift 3 se parece com isso
FormissKeyboard
fonte
[aTextField resignFirstResponder]
seria[self.view endEditing:YES];
ele não precisa de uma referência ao campo de texto e vai trabalhar para vários campos de texto[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
[tap setCancelsTouchesInView:NO];
pela resposta de @qiaoyi; Eu tive um problema com uma tabela que não respondeu às seleções de linha. 5 anos depois, espero que isso ajude outra pessoa.self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
Eu amassei algumas respostas.
Use um ivar que seja inicializado durante
viewDidLoad:
Ignore o que está sendo editado no momento:
fonte
Verifique isso, seria a maneira mais fácil de fazer isso,
Ou
Esta biblioteca irá lidar com a rolagem automática da barra de rolagem, toque no espaço para ocultar o teclado, etc.
https://github.com/michaeltyson/TPKeyboardAvoiding
fonte
Vejo que algumas pessoas estão tendo problemas ao usar o
UITapGestureRecognizer
método. A maneira mais fácil de obter essa funcionalidade, mantendo o comportamento de toque do botão existente intacto, é adicionar apenas uma linha à resposta de @ Jensen2k:Isso permitiu que meus botões existentes ainda funcionassem sem usar o método do @Dmitry Sitnikov.
Leia sobre isso
property
aqui (pesquiseCancelsTouchesInView
): Referência da classe UIGestureRecognizerNão sei ao certo como isso funcionaria com as barras de rolagem, pois vejo que alguns deles tiveram problemas, mas espero que outra pessoa possa ter o mesmo cenário que eu.
fonte
UIImageView
, adicione[imageView setUserInteractionEnabled:NO];
e você "clicará" nela, o que faz esse método funcionar.É melhor criar
UIView
uma instância deUIControl
(no construtor de interface) e conectar oTouchUpInside
evento aodismissKeyboard
método. EsteIBAction
método será parecido com:fonte
UITapGestureRecognizer
interferiu ao tocar nos botões dentro da visualização).touchesEnded
não funcionou porque havia umaUIScrollView
mexer com a cadeia de responder).Swift 4
Configure o seu
UIViewController
com este método de extensão uma vez, por exemploviewDidLoad
:e o teclado será descartado mesmo tocando no
NavigationBar
.fonte
Versão Swift, isso funciona em combinação com outros elementos (como um
UIButton
ou outroUITextField
):fonte
self
melhor do queself.view
canclesTouchesInView
é uma propriedade útil para usar. Obrigado.c#
. FYI Esse ponto-e-vírgula é permitido pela sintaxe, simplesmente não é necessário.Que tal isso: eu sei que este é um post antigo. Pode ajudar alguém :)
fonte
Esta é uma boa solução genérica:
Objetivo-C:
Rápido:
Baseado na solução @icodebuster: https://stackoverflow.com/a/18756253/417652
fonte
Swift 4 oneliner
fonte
Acho que a maneira mais fácil (e melhor) de fazer isso é subclassificar sua visão global e usar o
hitTest:withEvent
método para ouvir qualquer toque. Os toques no teclado não são registrados, então hitTest: withEvent é chamado apenas quando você toca / rola / desliza / pitada ... em outro lugar e, em seguida, chama[self endEditing:YES]
.É melhor do que usar,
touchesBegan
porquetouchesBegan
não é chamado se você clicar em um botão na parte superior da visualização. É melhor do que oUITapGestureRecognizer
que não pode reconhecer um gesto de rolagem, por exemplo. Também é melhor do que usar uma tela escura, porque em uma interface complexa e dinâmica do usuário, você não pode colocar a tela escura em qualquer lugar. Além disso, ele não bloqueia outras ações, você não precisa tocar duas vezes para selecionar um botão externo (como no caso deUIPopover
).Além disso, é melhor do que ligar
[textField resignFirstResponder]
, porque você pode ter muitos campos de texto na tela, portanto, isso funciona para todos eles.fonte
Essa deve ser a maneira mais fácil de ocultar o teclado tocando fora:
(em Como descartar o teclado quando o usuário toca em outra área fora do campo de texto? )
fonte
Se a visualização estiver totalmente incorporada a
UIScrollView
, você poderá usar o seguinte:O primeiro anima o teclado fora da tela quando a exibição da tabela é rolada e o posterior oculta o teclado como o aplicativo de mensagens padrão.
fonte
Você pode fazer isso usando o Storyboard no XCode 6 e acima:
Crie a ação para ocultar o teclado
Adicione isso ao arquivo de cabeçalho da classe usada pelo seu ViewController:
Em seguida, adicione isso ao arquivo de implementação do mesmo ViewController:
Agora, essa será uma das 'Ações recebidas' da cena do storyboard (por exemplo, ViewController):
Conecte a ação ao evento do usuário
Agora você precisa conectar esta ação ao gesto do usuário de tocar no teclado.
Importante - Você precisa converter o 'UIView' contido no seu storyboard em um UIControl , para que ele possa receber eventos. Selecione a visualização da hierarquia da cena do View Controller:
... e mude de classe:
Agora arraste do pequeno círculo ao lado da 'ação recebida' para a sua cena para uma parte 'vazia' da sua cena (na verdade você está arrastando a 'Ação recebida' para o UIControl). Você verá uma seleção de eventos aos quais você pode conectar sua ação:
Selecione a opção 'retocar por dentro'. Agora você conectou o IBAction que você criou a uma ação do usuário de tocar no teclado. Quando o usuário toca no teclado, ele fica oculto.
(OBSERVAÇÃO: para conectar a ação ao evento, você também pode arrastar a ação recebida diretamente para o UIControl na sua hierarquia dos Controladores de exibição. Ela é exibida como 'Controle' na hierarquia.)
fonte
Se eu entendi direito, você deseja renunciar ao teclado enquanto toca fora,
textfield
mas você não tem referência ao seutextfield
.Tente isso;
reftextField
Agora, no
textFieldDidBeginEditing
campo de texto referenciado definido comoAgora você pode usá-lo com facilidade em qualquer relógio de botão (adicionar um botão transparente para começar a editar é recomendado)
Ou, para renunciar ao botão Concluído, tente isso.
fonte
Apenas para adicionar à lista aqui minha versão de como descartar um teclado em um toque externo.
viewDidLoad:
Qualquer lugar:
fonte
Muitas ótimas respostas aqui sobre o uso de
UITapGestureRecognizer
- todas as quais quebramUITextField
o botão (X) claro. A solução é suprimir o reconhecedor de gestos por meio de seu representante:Não é a solução mais robusta, mas funciona para mim.
fonte
return !touchViewIsButton
. Eu acho que quaisquer outros botões que precisam descartar o teclado devem fazê-lo em suas ações. Além disso, o TouchUpInside pode não ser chamado quando o layout é alterado na dispensa do teclado.Você pode criar uma categoria para o UiView e substituir os toquesBegan meathod da seguinte maneira.
Ele está funcionando bem para mim e é uma solução centralizada para esse problema.
fonte
Versão rápida da resposta de @ Jensen2k:
Um forro
fonte
Usei o exemplo de Barry para o meu novo desenvolvimento. Funcionou muito bem! mas tive que incluir uma pequena alteração, necessária para descartar o teclado apenas para o campo de texto que está sendo editado.
Então, adicionei ao exemplo de Barry o seguinte:
Além disso, mudei o método hideKeyboard da seguinte maneira:
fonte
Uma das maneiras mais fáceis e curtas é adicionar esse código ao seu
viewDidLoad
fonte
fonte
Tentei muitas das respostas aqui e não tive sorte. Meu reconhecedor de gestos de toque sempre fazia com que eu
UIButtons
não respondesse quando tocado, mesmo quando eu definia acancelsTouchesInView
propriedade do reconhecedor de gestos como NÃO.Isto é o que acabou resolvendo o problema:
Tenha um ivar:
Quando um campo de texto começar a editar, defina o reconhecedor de gestos:
O truque está em como você configura o
dismissKeyboard
método:Eu acho que há algo sobre tirar a
dismissKeyboardSelector
execução da pilha de execução de manipulação de toque ...fonte
Envie uma mensagem
resignFirstResponder
para o arquivo de texto que o colocou lá. Por favor, consulte este post para mais informações.fonte
Isso funciona
Neste exemplo, aTextField é o único UITextField .... Se houver outros ou UITextViews, há um pouco mais a fazer.
fonte
fonte
Adicione este código ao seu arquivo ViewController.m :
fonte
Nesse caso, pode-se usar o ScrollView e adicioná-lo ao
TextField
ScrollView. Quero tocar emScrollView
e em Exibir e depois em Ignorar o teclado. Eu tentei criar código de exemplo por precaução. Como isso,Seu Storyboard Veja isso exatamente como.
fonte
Você pode usar o método UITapGestureRecongnizer para descartar o teclado clicando fora do UITextField. Ao usar esse método sempre que o usuário clicar fora do UITextField, o teclado será descartado. Abaixo está o trecho de código para usá-lo.
fonte
O conjunto de campos de texto delegado na exibição foi carregado:
Adicione esta função:
fonte