Question

J'ai un UITextField dans une classe MyCustomUIView et quand le UITextField perd le focus, je voudrais cacher le terrain et montrer quelque chose d'autre en place.

Le délégué du UITextField est réglé sur MyCustomUIView via IB et j'ai aussi « ai fini sur la sortie » et « édition a mis un terme » événements pointant vers une méthode IBAction au sein MyCustomUIView.

@interface MyCustomUIView : UIView { 

IBOutlet UITextField    *myTextField;

}

-(IBAction)textFieldLostFocus:(UITextField *)textField;

@end

Cependant, aucun de ces événements semblent se faire virer quand le UITextField perd le focus. Comment avez-vous piège / regardez pour cet événement?

Le délégué du UITextField est défini comme MyCustomUIView donc je reçois un message de textFieldShouldReturn pour masquer le clavier lorsque vous avez terminé.

Mais ce que je suis aussi intéressé est de trouver lorsque l'utilisateur appuie sur une autre zone de l'écran (par exemple un autre contrôle ou juste zone vide) et le champ de texte a perdu le focus.

Était-ce utile?

La solution

Je crois que vous devez désigner votre point de vue en tant que délégué UITextField comme ceci:

@interface MyCustomUIView : UIView <UITextFieldDelegate> { 

En prime, voici comment vous obtenez le clavier pour aller loin quand ils appuient sur le « fait » ou le retour des boutons, selon la façon dont vous avez défini cette propriété:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
  //This line dismisses the keyboard.       
  [theTextField resignFirstResponder];
  //Your view manipulation here if you moved the view up due to the keyboard etc.       
  return YES;
}

Autres conseils

Essayez d'utiliser délégué pour la méthode suivante:

- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"Lost Focus for content: %@", textField.text);
    return YES;
}

Cela a fonctionné pour moi.

Le problème avec la solution resignFirstResponder uniquement est, qu'il ne peut être déclenchée que par un explicite clavier ou UITextField événement. Je cherchais aussi un « événement de mise au point perdue » pour masquer le clavier, si quelque part en dehors du champ de texte a été tapé sur. La seule « solution » à proximité et pratique je suis tombé est, pour désactiver les interactions pour d'autres vues jusqu'à ce que l'utilisateur est terminé avec l'édition (coups Achevée / retour sur le clavier), mais toujours être en mesure de sauter entre les champs de texte pour faire des corrections sans la nécessité de glisser hors et dans le clavier à chaque fois.

L'extrait suivant peut-être utile à quelqu'un, qui veut faire la même chose:

// disable all views but textfields
// assign this action to all textfields in IB for the event "Editing Did Begin"
-(IBAction) lockKeyboard : (id) sender {

    for(UIView *v in [(UIView*)sender superview].subviews)
        if (![v isKindOfClass:[UITextField class]]) v.userInteractionEnabled = NO;
}

// reenable interactions
// assign this action to all textfields in IB for the event "Did End On Exit"
-(IBAction) disMissKeyboard : (id) sender {

    [(UIResponder*)sender resignFirstResponder]; // hide keyboard

    for(UIView *v in [(UIView*)sender superview].subviews)
        v.userInteractionEnabled = YES;
}

Vous pourriez avoir à sous-classe et la UITextField passer outre resignFirstResponder. resignFirstResponder sera appelé comme le champ de texte perd le focus.

Je pense que vous avez mis en œuvre UIKeyboardDidHideNotification et dans ce cas, vous

utiliser le code comme

[theTextField resignFirstResponder];

supprimer ce code.

également même écriture de code dans la méthode de textFieldShouldReturn. cette orientation a également perdu.

Pour ceux qui luttent avec cela dans Swift. Nous ajoutons un geste de reconnaissance à la vue du ViewController de sorte que lorsque la vue est exploité, nous rejetons le champ de texte. Il est important de ne pas annuler les clics ultérieurs sur la vue.

Swift 2.3

    override func viewDidLoad() {
        //.....

        let viewTapGestureRec = UITapGestureRecognizer(target: self, action: #selector(handleViewTap(_:)))
        //this line is important
        viewTapGestureRec.cancelsTouchesInView = false
        self.view.addGestureRecognizer(viewTapGestureRec)

         //.....
    }

    func handleViewTap(recognizer: UIGestureRecognizer) {
        myTextField.resignFirstResponder()
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top