Maneira fácil de dispensar o teclado?

Eu tenho alguns controles espalhados por muitas células da tabela na minha mesa, e eu queria saber se há uma maneira mais fácil de dispensar o teclado sem ter que percorrer todos os meus controles e renunciar a todos eles como o primeiro respondedor. Eu acho que a pergunta é … Como eu poderia obter o primeiro socorrista atual para o teclado?

Experimentar:
[self.view endEditing:YES];

Você pode forçar a exibição de edição atual a renunciar ao status do primeiro socorrista com [view endEditing:YES] . Isso esconde o teclado.

Ao contrário de -[UIResponder resignFirstResponder] , -[UIView endEditing:] pesquisará subvisualizações para localizar o primeiro respondedor atual. Assim, você pode enviá-lo para sua visualização de nível superior (por exemplo, self.view em um UIViewController ) e ele fará a coisa certa.

(Essa resposta incluía anteriormente algumas outras soluções, que também funcionavam, mas eram mais complicadas do que o necessário. Eu as removi para evitar confusão.)

Você pode enviar uma ação direcionada nula para o aplicativo, ele renunciará ao socorrista a qualquer momento sem ter que se preocupar com qual visão tem o status de socorrista.

Objetivo-C:

 [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil]; 

Swift 3.0:

 UIApplication.shared.sendAction(#selector(resignFirstResponder), to: nil, from: nil, for: nil) 

Ações direcionadas a nada são comuns no Mac OS X para comandos de menu, e aqui está uma utilidade para elas no iOS.

Para ser sincero, não estou louco por nenhuma das soluções propostas aqui. Eu encontrei uma boa maneira de usar um TapGestureRecognizer que eu acho que chega ao coração do seu problema: quando você clica em qualquer coisa além do teclado, dispense o teclado.

  1. Em viewDidLoad, registre-se para receber notifications do teclado e crie um UITapGestureRecognizer:

     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil]; [nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil]; tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)]; 
  2. Adicione os respondentes de mostrar / ocultar do teclado. Lá você adiciona e remove o TapGestureRecognizer ao UIView que deve dispensar o teclado quando tocado. Nota: Você não precisa adicioná-lo a todas as subvisualizações ou controles.

     -(void) keyboardWillShow:(NSNotification *) note { [self.view addGestureRecognizer:tapRecognizer]; } -(void) keyboardWillHide:(NSNotification *) note { [self.view removeGestureRecognizer:tapRecognizer]; } 
  3. O TapGestureRecognizer irá chamar sua function quando receber um toque e você pode dispensar o teclado assim:

     -(void)didTapAnywhere: (UITapGestureRecognizer*) recognizer { [textField resignFirstResponder]; } 

O bom desta solução é que ela filtra apenas para Taps, não para furtos. Portanto, se você tiver conteúdo de rolagem acima do teclado, os furtos ainda serão rolados e deixarão o teclado exibido. Ao remover o reconhecedor de gestos após o desaparecimento do teclado, os futuros toques na sua exibição são tratados normalmente.

Esta é uma solução para fazer o teclado desaparecer quando pressionado o return em qualquer campo de texto, adicionando código em um lugar (então não é necessário adicionar um manipulador para cada campo de texto):


considere este cenário:

Eu tenho um viewcontroller com dois viewcontroller (nome de usuário e senha). e o viewcontroller implementa o protocolo UITextFieldDelegate

Eu faço isso no viewDidLoad

 - (void)viewDidLoad { [super viewDidLoad]; username.delegate = self; password.delegate = self; } 

e o viewcontroller implementa o método opcional como

 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } 

e independentemente do campo de texto em que você está, assim que eu digito o return no teclado, ele é descartado!

No seu caso, o mesmo funcionaria, desde que você textFieldShouldReturn todo o delegado do campo de textFieldShouldReturn como self e implementasse textFieldShouldReturn

Uma abordagem melhor é ter algo “roubar” o status de socorrista.

Como o UIApplication é uma subclass do UIResponder, você pode tentar:

 [[UIApplication sharedApplication] becomeFirstResponder] [[UIApplication sharedApplication] resignFirstResponder] 

Caso contrário, crie um novo UITextField com um quadro de tamanho zero, adicione-o a uma vista em algum lugar e faça algo semelhante (torne-se seguido de resignação).

Coloque isso em alguma class de utilidade.

 + (void)dismissKeyboard { [self globalResignFirstResponder]; } + (void) globalResignFirstResponder { UIWindow * window = [[UIApplication sharedApplication] keyWindow]; for (UIView * view in [window subviews]){ [self globalResignFirstResponderRec:view]; } } + (void) globalResignFirstResponderRec:(UIView*) view { if ([view respondsToSelector:@selector(resignFirstResponder)]){ [view resignFirstResponder]; } for (UIView * subview in [view subviews]){ [self globalResignFirstResponderRec:subview]; } } 

@Nicholas Riley & @Kendall Helmstetter Geln & @cannyboy:

Absolutamente shiny!

Obrigado.

Considerando seu conselho e o conselho de outras pessoas neste assunto, foi o que fiz:

O que parece quando usado:

[[self appDelegate] dismissKeyboard]; (nota: eu adicionei appDelegate como uma adição ao NSObject para que eu possa usar qualquer lugar em qualquer coisa)

O que parece sob o capô:

 - (void)dismissKeyboard { UITextField *tempTextField = [[[UITextField alloc] initWithFrame:CGRectZero] autorelease]; tempTextField.enabled = NO; [myRootViewController.view addSubview:tempTextField]; [tempTextField becomeFirstResponder]; [tempTextField resignFirstResponder]; [tempTextField removeFromSuperview]; } 

EDITAR

Alteração da minha resposta para incluído tempTextField.enabled = NO; . Desativar o campo de texto impedirá que as notifications do teclado UIKeyboardWillHideNotification e UIKeyboardWillHideNotification sejam enviadas, se você confiar nessas notifications em todo o seu aplicativo.

Muitas respostas excessivamente complicadas aqui, talvez porque isso não seja fácil de encontrar na documentação do iOS. JosephH tinha logo acima:

 [[view window] endEditing:YES]; 

Dica rápida sobre como descartar o teclado no iOS quando um usuário toca em qualquer lugar na canvas, fora do UITextField ou do teclado. Considerando a quantidade de imóveis que o teclado iOS pode ocupar, faz sentido ter uma maneira fácil e intuitiva para os usuários dispensarem o teclado.

Aqui está um link

Ainda mais simples que a resposta de Meagar

touchesBegan:withEvent:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [textField resignFirstResponder];` } 

Isso dismiss the keyboard quando você tocar em qualquer lugar no background .

Em seu arquivo de header do view controller, adicione à definição da interface do seu controlador para que ele esteja em conformidade com o protocolo delegado UITextField …

 @interface someViewController : UIViewController  

… No arquivo de implementação do controlador (.m), adicione o seguinte método ou o código dentro dele, se você já tiver um método viewDidLoad …

 - (void)viewDidLoad { // Do any additional setup after loading the view, typically from a nib. self.yourTextBox.delegate = self; } 

… Em seguida, vincule sua checkbox de texto ao seu campo de texto real

 - (BOOL)textFieldShouldReturn:(UITextField *)theTextField { if (theTextField == yourTextBox) { [theTextField resignFirstResponder]; } return YES; } 

Aqui está o que eu uso no meu código. Ele funciona como um encanto!

Em yourviewcontroller.h add:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Agora no arquivo .m, adicione isso à sua function ViewDidLoad:

 - (void)viewDidLoad { //Keyboard stuff tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapAnywhere:)]; tapRecognizer.cancelsTouchesInView = NO; [self.view addGestureRecognizer:tapRecognizer]; } 

Além disso, adicione essa function no arquivo .m:

 - (void)handleSingleTap:(UITapGestureRecognizer *) sender { [self.view endEditing:YES]; } 

Você deve enviar endEditing: para a janela de trabalho, sendo a subclass de UIView

 [[UIApplication sharedApplication].windows.firstObject endEditing:NO]; 

A melhor maneira de dispensar o teclado do UITableView e do UIScrollView é:

 tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag 

No swift 3 você pode fazer o seguinte

 UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) 

A resposta de Jeremy não estava funcionando bem para mim, porque eu tinha uma pilha de navegação em uma aba com uma checkbox de modal dialog sobre ela. Estou usando o seguinte agora e está funcionando para mim, mas sua milhagem pode variar.

  // dismiss keyboard (mostly macro) [[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord // --- dismiss keyboard (in indexAppDelegate.h) (mostly macro) - (void)dismissKeyboard; // --- dismiss keyboard (in indexAppDelegate.m) (mostly macro) // do this from anywhere to dismiss the keybard - (void)dismissKeyboard { // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero]; UIViewController *myRootViewController = <#viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called. Probably is a way to determine this progragrammatically) UIViewController *uivc; if (myRootViewController.navigationController != nil) { // for when there is a nav stack uivc = myRootViewController.navigationController; } else { uivc = myRootViewController; } if (uivc.modalViewController != nil) { // for when there is something modal uivc = uivc.modalViewController; } [uivc.view addSubview:tempTextField]; [tempTextField becomeFirstResponder]; [tempTextField resignFirstResponder]; [tempTextField removeFromSuperview]; [tempTextField release]; } 

Você também pode precisar replace o UIViewController disablesAutomaticKeyboardDismissal para que isso funcione em alguns casos. Isso pode ter que ser feito no UINavigationController se você tiver um.

Subclass seus campos de texto … e também textviews

Na subclass coloque este código ..

 -(void)conformsToKeyboardDismissNotification{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil]; } -(void)deConformsToKeyboardDismissNotification{ [[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil]; } - (void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self]; [self resignFirstResponder]; } 

Nos delegates do campo de texto (da mesma forma para os delegates de textview)

 -(void)textFieldDidBeginEditing:(JCPTextField *)textField{ [textField conformsToKeyboardDismissNotification]; } - (void)textFieldDidEndEditing:(JCPTextField *)textField{ [textField deConformsToKeyboardDismissNotification]; } 

Tudo pronto .. Agora basta postar a notificação de qualquer lugar no seu código. Ele irá renunciar a qualquer teclado.

E em rápida nós podemos fazer

 UIApplication.sharedApplication().sendAction("resignFirstResponder", to: nil, from: nil, forEvent: nil) 

Para dispensar um teclado depois que o teclado apareceu, há dois casos ,

  1. quando o UITextField está dentro de um UIScrollView

  2. quando o UITextField está fora de um UIScrollView

2.Quando o UITextField está fora de um UIScrollView, sobrescreva o método na sua subclass UIViewController.

você também deve adicionar delegado para todos os UITextView

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; } 
  1. Em uma exibição de rolagem, Tocar fora não ativará nenhum evento , portanto, nesse caso, use um Reconhecedor de gestos de toque , Arraste e solte um UITapGesture para a visualização de rolagem e crie uma IBAction para ele .

Para criar um IBAction, pressione Ctrl + clique no UITapGesture e arraste-o para o arquivo .h do viewcontroller.

Aqui eu nomeei tappedEvent como meu nome de ação

 - (IBAction)tappedEvent:(id)sender { [self.view endEditing:YES]; } 

o acima dado informação foi derivado do seguinte link, por favor consulte para mais informações ou contacte-me se você não entender os dados acima.

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/

Eu odeio que não há uma maneira “global” de descartar o teclado programaticamente sem usar chamadas de API privadas. Freqüentemente, eu tenho a necessidade de dispensar o teclado programaticamente sem saber qual object é o primeiro respondedor. Eu recorri a inspecionar o self usando a API de tempo de execução do Objective-C, enumerando todas as suas propriedades, retirando aquelas que são do tipo UITextField e enviando a mensagem resignFirstResponder .

Não deveria ser tão difícil fazer isso …

Não é bonito, mas a maneira como renuncio o firstResponder quando não sei qual é o respondente:

Crie um UITextField, no IB ou programaticamente. Torne-o oculto. Vincule-o ao seu código se você fizer isso no IB. Então, quando você quiser descartar o teclado, você alterna o respondente para o campo de texto invisível e renuncia imediatamente:

  [self.invisibleField becomeFirstResponder]; [self.invisibleField resignFirstResponder]; 

Você pode iterar recursivamente por meio de subvisualizações, armazenar uma matriz de todos os UITextFields e, em seguida, percorrê-los e renunciar a todos eles.

Não é realmente uma ótima solução, especialmente se você tiver muitas subvisualizações, mas, para aplicativos simples, isso deve funcionar.

Eu resolvi isso de uma forma muito mais complicada, mas muito mais eficaz, mas usando um singleton / manager para o mecanismo de animação do meu aplicativo, e sempre que um campo de texto se tornasse o respondente, atribuiria a ele a uma estática varreu (renunciou) com base em alguns outros events … é quase impossível para mim explicar em um parágrafo.

Seja criativo, levei apenas 10 minutos para pensar nisso em meu aplicativo depois que encontrei essa pergunta.

Um método um pouco mais robusto que precisei usar recentemente:

 - (void) dismissKeyboard { NSArray *windows = [UIApplication sharedApplication].windows; for(UIWindow *window in windows) [window endEditing:true]; // Or if you're only working with one UIWindow: [[UIApplication sharedApplication].keyWindow endEditing:true]; } 

Eu encontrei alguns dos outros methods “globais” não funcionou (por exemplo, UIWebView & WKWebView se recusou a renunciar).

Adicione um Reconhecedor de gestos de toque à sua visualização. E defina-o como ibaction

seu arquivo .m será como

  - (IBAction)hideKeyboardGesture:(id)sender { NSArray *windows = [UIApplication sharedApplication].windows; for(UIWindow *window in windows) [window endEditing:true]; [[UIApplication sharedApplication].keyWindow endEditing:true]; } 

Funcionou para mim

Sim, endEditing é a melhor opção. E do iOW 7.0, o UIScrollView tem um recurso interessante para dispensar o teclado ao interagir com a exibição de rolagem. Para conseguir isso, você pode definir a propriedade keyboardDismissMode do UIScrollView .

Defina o modo de dispensa do teclado como:

 tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag 

Tem alguns outros tipos. Dê uma olhada neste documento da apple .

Em rápida:

 self.view.endEditing(true) 

a maneira mais fácil é chamar o método

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if(![txtfld resignFirstResponder]) { [txtfld resignFirstResponder]; } else { } [super touchesBegan:touches withEvent:event]; } 

Você tem que usar um desses methods,

 [self.view endEditing:YES]; 

ou

 [self.textField resignFirstResponder];