objective c - como - Maneira fácil de dispensar o teclado?



combinações colocar (20)

Eu tenho alguns controles espalhados por muitas células de 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 questão é .. Como eu iria receber o atual primeiro socorrista para o teclado?

https://src-bin.com


Answer #1

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

Absolutamente brilhante!

Obrigado.

Considerando seu conselho e o conselho de outras pessoas neste tópico, foi o que fiz:

O que parece quando usado:

[[self appDelegate] dismissKeyboard]; (nota: eu acrescentei o 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

Emenda à minha resposta para incluído tempTextField.enabled = NO; . Desativar o campo de texto impedirá que as notificações do teclado UIKeyboardWillHideNotification e UIKeyboardWillHideNotification sejam enviadas, caso você dependa dessas notificações em todo o aplicativo.


Answer #2

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

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag

Answer #3

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


Answer #4

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 .


Answer #5

Coloque isso em alguma classe 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];
    }
}

Answer #6

Dica rápida sobre como descartar o teclado no iOS quando um usuário tocar em qualquer lugar na tela fora do UITextField ou do teclado. Considerando o quanto de imóveis 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


Answer #7

Em rápida:

self.view.endEditing(true)

Answer #8

Em seu arquivo de cabeçalho do view controller, adicione <UITextFieldDelegate> à definição da interface do seu controlador para que ele esteja em conformidade com o protocolo delegado UITextField ...

@interface someViewController : UIViewController <UITextFieldDelegate>

... 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 caixa de texto ao seu campo de texto real

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

Answer #9

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 objeto é 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-as a mensagem resignFirstResponder .

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


Answer #10

Experimentar:
[self.view endEditing:YES];


Answer #11

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

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

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

Answer #12

No swift 3 você pode fazer o seguinte

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

Answer #13

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. No viewDidLoad, registre-se para receber notificações 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 respondedores 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 função 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 toques e não para furtos. Portanto, se você tiver conteúdo de rolagem acima do teclado, os furos ainda rolarão 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.


Answer #14

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 .


Answer #15

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


Answer #16

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 métodos "globais" não funcionou (por exemplo, UIWebView & WKWebView se recusou a renunciar).


Answer #17

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

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

Answer #18

Você pode enviar uma ação direcionada nula para o aplicativo, ele renunciará ao socorrista a qualquer momento sem precisar 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.


Answer #19

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 melhor, 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 que varreu (renunciou) com base em alguns outros eventos ... é 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.


Answer #20

Você tem que usar um desses métodos,

[self.view endEditing:YES];

ou

[self.textField resignFirstResponder];




sdk