Pergunta

Eu sei que eu preciso dizer meu UITextField a demitir-se primeiro respondedor quando eu quero dismis o teclado, mas não tenho certeza de como saber quando o usuário pressionou a tecla "Concluído" no teclado. Existe uma notificação posso assistir para?

Foi útil?

Solução

Eu defini o delegado do UITextField a minha classe ViewController.

Em que classe I implementado este método da seguinte forma:

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

Outras dicas

Se você conectar o evento DidEndOnExit do campo de texto para uma ação (IBAction) em InterfaceBuilder, ele será enviado mensagens quando o usuário descarta o teclado (com a tecla de retorno) eo remetente será uma referência para o UITextField que disparou o evento.

Por exemplo:

-(IBAction)userDoneEnteringText:(id)sender
{
    UITextField theField = (UITextField*)sender;
    // do whatever you want with this text field
}

Então, em InterfaceBuilder, ligar o evento DidEndOnExit do campo de texto para esta ação em seu controlador (ou o que você está usando para eventos de link a partir do UI). Sempre que o usuário insere texto e demite o campo de texto, o controlador será enviado esta mensagem.

Você também pode criar um método em seu controlador

 -(IBAction)editingEnded:(id)sender{
    [sender resignFirstResponder]; 
}

e, em seguida, em Connection Inspector no IB connect Evento "acabou No Exit" para ele.

kubi, obrigado. Seu código funcionou. Só para ser explícito (para iniciantes gosto), como você dizer que você tem que definir UITextField do delegate ser igual ao ViewController no qual reside campo de texto. Você pode fazer isso onde quer que você agradar. Eu escolhi o método viewDidLoad.

- (void)viewDidLoad 
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}

Aqui está um truque para obter o comportamento automático demissão teclado com nenhum código de todo. Na ponta, editar o objeto proxy First Responder no Inspetor de Identidade, adicionando uma nova ação socorrista; vamos chamá-lo dummy:. Agora ligar o acabou no evento Sair do campo de texto para a ação dummy: do objeto proxy First Responder. É isso aí! Desde do campo de texto acabou no evento Sair agora tem um par ação-alvo, o campo de texto descarta automaticamente o seu teclado quando o usuário toca Retorno; e uma vez que não há nenhuma penalidade por não encontrar um manipulador para uma mensagem enviada a cadeia de resposta, o aplicativo não falhar, mesmo que não há nenhuma implementação de qualquer lugar dummy:.

Apenas add

[textField endEditing:YES];

onde você quiser desativar teclado e apresentar a vista selecionador.

Em Swift você pode escrever um IBAction no controlador e definir o acabou On Exit caso de campo de texto para que a ação

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}

Você também pode usar

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
  {

   [self.yourTextField resignFirstResponder];

  }

Melhor que se você tiver muitos Uitextfields:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {    
     [self.view endEditing:YES];
 }

Aqui está o que eu tinha que fazer para obtê-lo para o trabalho, e eu acho que é necessário para qualquer pessoa com um teclado numérico de um teclado (ou quaisquer outras sem um botão feito:

  1. Mudei o UIView no ViewController a um UIControl.
  2. Eu criei uma função chamada

    -(IBAction)backgroundIsTapped:(id)sender
    

Este também foi definido no arquivo .h.

Depois disso, eu ligado a à pouco 'pousar' para o ViewController no Interface Builder.

função

No 'fundo é aproveitado', eu coloquei isso:

    [answerField resignFirstResponder];

Apenas lembre-se de mudança 'answerField' para o nome do UITextField que deseja remover o teclado (obviamente se certificar que seu UITextField é definido como a seguir:)

    IBOutlet UITextField * <nameoftextfieldhere>;

Eu sei que este assunto provavelmente morreu há muito tempo ... mas eu estou esperando que isso vai ajudar alguém, em algum lugar!

Você vai notar que o método "textFieldShouldReturn" fornece o objeto de texto-campo que atingiu a chave feito. Se você definir o TAG, você pode ativar esse campo de texto. Ou você pode controlar e comparar o ponteiro do objeto com algum valor membro armazenados pelo seu criador.

A minha abordagem é assim por um auto-estudo:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    bool fDidResign = [textField resignFirstResponder];

    NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");

    return fDidResign;
}

Enquanto isso, eu coloquei o teste de "validação" que nega a renúncia segue. É apenas para ilustração, por isso, se o usuário digita NÃO! no campo, não vai demitir. O comportamento foi como eu queria, mas a seqüência de saída não foi como eu esperava.

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    if( [[textField text] isEqualToString:@"NO!"] ) {
        NSLog(@"%@", textField.text);
        return NO;
    } else {
        return YES;
    }
}

A seguir é a minha saída NSLog para essa negação seguido pela aceitação. Você vai notar que eu estou retornando o resultado do renunciar, mas eu esperava que retornar FALSE para me denunciar volta para o chamador ?! Fora isso, ele tem o comportamento necessário.

13.313 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
13.320 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
13.327 StudyKbd[109:207] NO!
13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]
59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:]
59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: NO
59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard

Aqui está uma maneira bastante limpa para edição final com a tecla Retorno ou um toque no fundo.

Em Interface Builder, incorporar seus campos em uma visão de UIFormView classe

O que esta classe:

  • juntar-se automaticamente como campos de delegado (Ou despertou de ponta, ou adicionado manualmente)
  • Mantenha uma referência no campo editado atual
  • Dispensar o teclado sobre o regresso ou toque no fundo

Aqui está o código:

Interface

#import <UIKit/UIKit.h>

@interface UIFormView : UIView<UITextFieldDelegate>

-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;

@end

Implementação

#import "UIFormView.h"

@implementation UIFormView
{
    UITextField* currentEditingTextField;
}

// Automatically register fields

-(void)addSubview:(UIView *)view
{
    [super addSubview:view];
    if ([view isKindOfClass:[UITextField class]]) {
        if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
    }
}

// UITextField Protocol

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    currentEditingTextField = textField;
}

-(void)textFieldDidEndEditing:(UITextField *)textField
{
    currentEditingTextField = NULL;
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self endEdit];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if ([self textFieldValueIsValid:textField]) {
        [self endEdit];
        return YES;
    } else {
        return NO;
    }
}

// Own functions

-(void)endEdit
{
    if (currentEditingTextField) {
        [currentEditingTextField endEditing:YES];
        currentEditingTextField = NULL;
    }
}


// Override this in your subclass to handle eventual values that may prevent validation.

-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
    return YES;
}

@end
  • Por subclasse o formulário e substituindo o método textFieldValueIsValid:, você pode evitar fim da edição, se o valor não é correto para o dado campo.

  • Se um campo tem um conjunto delegado no Interface Builder, em seguida, o formulário não mudá-lo. Não vejo muitas razões para definir um delegado diferente para um campo particular, mas por que não ...

Há muitas maneiras de melhorar esta classe de exibição de formulário - Anexar um delegado, fazer alguma layout, pega quando os teclados cobre um campo (usando o quadro currentEditingTextField), iniciam automaticamente edição para o próximo campo, ...

Eu, pessoalmente, mantê-lo no meu quadro, e sempre subclasse-lo para adicionar recursos, é muitas vezes útil "como está".

Espero que irá ajuda. Felicidades todos

Se você quiser toda a edição de um UIViewController você pode usar.

[[self view]endEditing:YES];

e se você quiser demitir um hide Teclado UITextField perticular então usar.

1.Add delegar na sua viewcontroller.h

<UITextFieldDelegate>
  1. Faça delegação incapazes de seu campo de texto.

    self.yourTextField.delegate = auto;

  2. adicionar este método na sua viewcontroller.

    - (BOOL) textFieldShouldEndEditing: (UITextField *) textField { [TextField resignFirstResponder]; retornar YES;}

programaticamente definir o delegado do UITextField em Swift 3

Implementar UITextFieldDelegate em seu arquivo ViewController.Swift (classe por exemplo ViewController: UIViewController, UITextFieldDelegate {)

 lazy var firstNameTF: UITextField = {

    let firstname = UITextField()
    firstname.placeholder = "FirstName"
    firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
    firstname.textAlignment = .center
    firstname.borderStyle = UITextBorderStyle.roundedRect
    firstname.keyboardType = UIKeyboardType.default
    firstname.delegate = self
    return firstname
}()

lazy var lastNameTF: UITextField = {

    let lastname = UITextField()
    lastname.placeholder = "LastName"
    lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
    lastname.textAlignment = .center
    lastname.borderStyle = UITextBorderStyle.roundedRect
    lastname.keyboardType = UIKeyboardType.default
    lastname.delegate = self
    return lastname
}()

lazy var emailIdTF: UITextField = {

    let emailid = UITextField()
    emailid.placeholder = "EmailId"
    emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
    emailid.textAlignment = .center
    emailid.borderStyle = UITextBorderStyle.roundedRect
    emailid.keyboardType = UIKeyboardType.default
    emailid.delegate = self
    return emailid
}()

// Mark: - manipulação delegado textField ..

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    view.endEditing(true)
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    if textField == firstNameTF {

        lastNameTF.becomeFirstResponder()
    }

    else if textField == lastNameTF {

        emailIdTF.becomeFirstResponder()
    }
    else {
        view.emailIdTF(true)
    }
    return true
}

Crie uma função hidekeyboard e vinculá-lo para o campo de texto no arquivo .xib e selecione DidEndOnExit

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  

Se você tiver criado o ponto de vista usando Interface Builder, use o seguinte Basta criar um método,

-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}

Apenas clique direito no campo de texto na vista, e definir o evento como acabou na saída, e fio-lo para o método "dismissKeyboard".

O melhor guia para iniciantes é "Cabeça iPhone Primeiro e iPad Desenvolvimento, 2nd Edition"

Tente este

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}

Quem procura Swift 3

1) Verifique se o seu Delegado do UITextField é ligado ao seu ViewController no Storyboard

2) Implementar UITextFieldDelegate em seu arquivo ViewController.Swift (classe por exemplo ViewController: UIViewController, UITextFieldDelegate {)

3) Use o método delegado abaixo

func textFieldShouldReturn(textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
return false }

Isto é como eu dispensar o teclado na Swift 4.2 e ele funciona para mim:

    override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: 
    #selector(dismissKeyboard))

    view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    numberField.resignFirstResponder()
    }

Swift 3, iOS 9 +

@IBAction private func noteFieldDidEndOnExit(_ sender: UITextField) {}

UPD: Ele ainda funciona bem para mim. Acho cara que dedicou esta resposta só não entendi o que ele precisa para ligar esta ação para o UITextField no storyboard.

textField.returnKeyType = UIReturnKeyDone;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top