Eu tenho alguns controles espalhados por muitas células da tabela e fiquei pensando se há uma maneira mais fácil de descartar o teclado sem ter que percorrer todos os meus controles e renunciar a todos como o primeiro respondedor. Eu acho que a pergunta é .. Como eu colocaria o primeiro atendente atual no teclado?
objective-c
cocoa-touch
sdk
Seventoes
fonte
fonte
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Respostas:
Tentar:
fonte
[self.view endEditing:YES];
como os valores BOOL são SIM / NÃO no Objetivo-C.Você pode forçar a exibição de edição atual a renunciar ao status de primeiro respondedor
[view endEditing:YES]
. Isso oculta o teclado.Ao contrário
-[UIResponder resignFirstResponder]
,-[UIView endEditing:]
procurará nas sub-visualizações para encontrar o primeiro atendedor atual. Assim, você pode enviá-lo para sua visualização de nível superior (por exemplo,self.view
em aUIViewController
) e ele fará a coisa certa.(Essa resposta anteriormente incluía algumas outras soluções, que também funcionavam, mas eram mais complicadas do que o necessário. Eu as removi para evitar confusão.)
fonte
[self.view endEditing:YES];
resposta é melhor.[UIView endediting:]
funciona. Em um dos aplicativos que desenvolvi, uma caixa de pesquisa foi adicionada no UINavigationViewController; se você chamar[self.view endEditing:YES]
, comoself
seu controlador de exibição, isso não funcionará. Em vez disso, chamei esse método diretamente no escopo da exibição onde a caixa de pesquisa foi adicionada, por exemplo:[self.mySearchBoxView endEditing:YES]
.Você pode enviar uma ação nula direcionada para o aplicativo, ele renunciará ao socorrista a qualquer momento, sem precisar se preocupar com qual visualização atualmente possui o status de socorrista.
Objetivo-C:
Swift 3.0:
Nenhuma ação direcionada é comum no Mac OS X para comandos de menu, e aqui está um uso para elas no iOS.
fonte
Para ser sincero, não sou louco por nenhuma das soluções propostas aqui. Encontrei uma boa maneira de usar um TapGestureRecognizer que acho que está no coração do seu problema: quando você clica em qualquer coisa além do teclado, ignore-o.
No viewDidLoad, registre-se para receber notificações do teclado e crie um UITapGestureRecognizer:
Adicione o teclado show / hide responders. Lá você adiciona e remove o TapGestureRecognizer para o UIView que deve descartar o teclado quando tocado. Nota: Você não precisa adicioná-lo a todas as sub-visualizações ou controles.
O TapGestureRecognizer chamará sua função quando tocar e você poderá descartar o teclado assim:
O bom dessa solução é que ela filtra apenas torneiras, não furtos. Portanto, se você tiver rolando o conteúdo acima do teclado, os deslizadores ainda rolam e deixam o teclado exibido. Ao remover o reconhecedor de gestos após o teclado desaparecer, os toques futuros na sua exibição são gerenciados normalmente.
fonte
Esta é uma solução para fazer com que o teclado desapareça quando pressionado
return
em qualquer campo de texto, adicionando código em um único local (portanto, não é necessário adicionar um manipulador para cada campo de texto):considere este cenário:
Eu tenho um
viewcontroller
com dois campos de texto (nome de usuário e senha). e o protocolo deviewcontroller
implementosUITextFieldDelegate
eu faço isso em viewDidLoad
e o viewcontroller implementa o método opcional como
e independentemente do campo de texto em que você está, assim que eu clico
return
no teclado, ele é descartado!No seu caso, o mesmo funcionaria desde que você defina todos os delegados do campo de texto como auto e implementem
textFieldShouldReturn
fonte
Uma abordagem melhor é fazer com que algo "roube" o status de socorrista.
Como o UIApplication é uma subclasse do UIResponder, você pode tentar:
Caso contrário, crie um novo UITextField com um quadro de tamanho zero, adicione-o a uma exibição em algum lugar e faça algo semelhante (torne-se seguido de renúncia).
fonte
Coloque isso em alguma aula de utilidade.
fonte
@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy:
Absolutamente brilhante!
Obrigado.
Considerando o seu conselho e o de outras pessoas neste segmento, foi o que eu fiz:
Como fica quando usado:
[[self appDelegate] dismissKeyboard];
(observação: adicionei appDelegate como uma adição ao NSObject para que eu possa usar em qualquer lugar em qualquer coisa)O que parece sob o capô:
EDITAR
Alteração à minha resposta incluída
tempTextField.enabled = NO;
. A desativação do campo de texto irá impedirUIKeyboardWillShowNotification
eUIKeyboardWillHideNotification
notificações de teclado sejam enviados você deve confiar sobre estas notificações em todo o seu aplicativo.fonte
Dica rápida sobre como descartar o teclado no iOS quando um usuário toca em qualquer lugar da tela fora do UITextField ou teclado. Considerando a quantidade de espaço que o teclado do iOS pode ocupar, faz sentido ter uma maneira fácil e intuitiva para que seus usuários descartem o teclado.
Aqui está um link
fonte
Muitas respostas excessivamente complicadas aqui, talvez porque isso não seja fácil de encontrar na documentação do iOS. JosephH tinha logo acima:
fonte
Ainda mais simples que a resposta de Meagar
substituir
touchesBegan:withEvent:
Isso acontece
dismiss the keyboard
quando você toca em qualquer lugar dobackground
.fonte
Aqui está o que eu uso no meu código. Ele funciona como um encanto!
Em yourviewcontroller.h, adicione:
@property (nonatomic) UITapGestureRecognizer *tapRecognizer;
Agora no arquivo .m, adicione isso à sua função ViewDidLoad:
Além disso, adicione esta função no arquivo .m:
fonte
No arquivo de cabeçalho do seu controlador de exibição, inclua
<UITextFieldDelegate>
na definição da interface do seu controlador, para que esteja em conformidade com o protocolo de delegação UITextField ...... No arquivo de implementação do controlador (.m), adicione o seguinte método, ou o código, se você já tiver um método viewDidLoad ...
... Em seguida, vincule yourTextBox ao seu campo de texto real
fonte
Você deve enviar
endEditing:
para a janela de trabalho sendo a subclasse deUIView
fonte
A melhor maneira de descartar o teclado do UITableView e UIScrollView é:
fonte
No swift 3, você pode fazer o seguinte
fonte
A resposta de Jeremy não estava funcionando muito bem para mim, acho que porque eu tinha uma pilha de navegação em uma visualização de guia com uma caixa de diálogo modal em cima. Estou usando o seguinte agora e está funcionando para mim, mas sua milhagem pode variar.
fonte
Também pode ser necessário substituir o UIViewController disablesAutomaticKeyboardDismissal para que isso funcione em alguns casos. Isso pode ter que ser feito no UINavigationController, se você tiver um.
fonte
Subclasse seus campos de texto ... e também visualizações de texto
Na subclasse coloque este código ..
Nos delegados do campo de texto (da mesma forma para delegados do textview)
Tudo pronto .. Agora basta postar a notificação em qualquer lugar do seu código. Ele renunciará a qualquer teclado.
fonte
E rapidamente podemos fazer
fonte
Para descartar um teclado depois que ele aparecer, existem 2 casos ,
quando o UITextField estiver dentro de um UIScrollView
quando o UITextField estiver fora de um UIScrollView
2. quando o UITextField estiver fora de um UIScrollView, substitua o método na sua subclasse UIViewController
você também deve adicionar delegado para todos os UITextView
para criar uma IBAction, pressione ctrl + clique no UITapGesture e arraste-o para o arquivo .h do viewcontroller.
Aqui nomeei tappedEvent como meu nome de ação
As informações acima foram obtidas a partir do link a seguir, consulte para obter mais informações ou entre em contato comigo se você não entender os dados acima.
http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/
fonte
Detesto que não haja uma maneira "global" de descartar programaticamente o teclado sem usar chamadas de API privadas. Freqüentemente, tenho a necessidade de descartar o teclado programaticamente sem saber qual objeto é o primeiro respondedor. Eu tentei inspecionar o
self
uso da API de tempo de execução Objective-C, enumerando todas as suas propriedades, retirando as que são do tipoUITextField
e enviando aresignFirstResponder
mensagem.Não deve ser tão difícil fazer isso ...
fonte
Não é bonito, mas a maneira como eu renuncio o firstResponder quando não sei o que é esse respondedor:
Crie um UITextField, no IB ou programaticamente. Torná-lo oculto. Vincule-o ao seu código, se você o criou no IB. Então, quando você deseja descartar o teclado, alterne o respondedor para o campo de texto invisível e o renuncie imediatamente:
fonte
Você pode iterar recursivamente por meio de sub-visualizações, armazenar uma matriz de todos os UITextFields e, em seguida, fazer um loop por eles e renunciar a todos.
Não é realmente uma ótima solução, especialmente se você tiver muitas subviews, mas para aplicativos simples, isso deve funcionar.
Resolvi isso de uma maneira muito mais complicada, mas com muito mais desempenho, mas usando um singleton / gerente para o mecanismo de animação do meu aplicativo, e sempre que um campo de texto se tornasse o responsável pela resposta, eu atribuiria uma atribuição a uma estática que obteria varreu (renunciou) com base em outros eventos ... é quase impossível para mim explicar em um parágrafo.
Seja criativo, levei apenas 10 minutos para pensar sobre isso no meu aplicativo depois de encontrar essa pergunta.
fonte
Um método um pouco mais robusto que eu precisava usar recentemente:
Descobri que alguns dos outros métodos "globais" não funcionaram (por exemplo,
UIWebView
eWKWebView
recusamos renunciar).fonte
Adicione um reconhecedor de gestos de toque à sua visualização.
seu arquivo .m será como
Funcionou para mim
fonte
Sim, a edição final é a melhor opção. E a partir do iOW 7.0,
UIScrollView
possui um recurso interessante para descartar o teclado ao interagir com a visualização de rolagem. Para conseguir isso, você pode definir akeyboardDismissMode
propriedade deUIScrollView
.Defina o modo de desativação do teclado como:
Tem alguns outros tipos. Veja este documento da apple .
fonte
Em rápida:
fonte
a maneira mais fácil é chamar o método
fonte
Você precisa usar um desses métodos,
ou
fonte