Je sais que je dois indiquer à mon UITextField de renvoyer le premier intervenant lorsque je veux désactiver le clavier, mais je ne sais pas comment savoir si l'utilisateur a appuyé sur la touche "Done" du clavier. Existe-t-il une notification que je peux surveiller ?
Réponses
Trop de publicités?Voici ce que j'ai dû faire pour que cela fonctionne, et je pense que c'est nécessaire pour tous ceux qui ont un pavé numérique comme clavier (ou tout autre clavier sans bouton "faire") :
- J'ai remplacé l'UIView du ViewController par un UIControl.
-
J'ai créé une fonction appelée
-(IBAction)backgroundIsTapped:(id)sender
Ceci a également été défini dans le fichier .h.
Après cela, j'ai fait le lien avec la partie "touch down" pour le ViewController dans Interface Builder.
Dans la fonction 'background is tapped', j'ai mis ceci :
[answerField resignFirstResponder];
N'oubliez pas de remplacer 'answerField' par le nom de l'UITextField dont vous voulez supprimer le clavier (assurez-vous évidemment que votre UITextField est défini comme ci-dessous :)
IBOutlet UITextField * <nameoftextfieldhere>;
Je sais que ce sujet est probablement mort depuis longtemps... mais j'espère que cela aidera quelqu'un, quelque part !
Voici une façon assez propre de terminer l'édition avec la touche Retour ou une touche en arrière-plan.
Dans le constructeur d'interface, intégrez vos champs dans une vue de la classe UIFormView
Qu'est-ce que cette classe :
- S'attache automatiquement en tant que délégué de champ ( soit réveillé depuis la nib, soit ajouté manuellement )
- Conserver une référence sur le champ édité actuel
- Désactiver le clavier au retour ou au toucher en arrière-plan
Voici le code :
Interface
#import <UIKit/UIKit.h>
@interface UIFormView : UIView<UITextFieldDelegate>
-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;
@end
Mise en œuvre
#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
-
En sous-classant le formulaire et en surchargeant la fonction
textFieldValueIsValid:
méthode, vous éviter la fin de l'édition si la valeur n'est pas correcte pour le champ donné. champ. -
Si un champ a un délégué défini dans Interface Builder, le formulaire ne le modifie pas. Je ne vois pas beaucoup de raisons de définir un délégué différent pour un champ particulier, mais pourquoi pas
Il y a de nombreuses façons d'améliorer cette classe de vue de formulaire - Attacher un délégué, faire de la mise en page, gérer lorsque le clavier couvre un champ (en utilisant le cadre currentEditingTextField), démarrer automatiquement l'édition pour le champ suivant, ...
Personnellement, je le garde dans mon framework, et je le sous-classe toujours pour ajouter des fonctionnalités, il est souvent utile "tel quel".
J'espère que cela vous aidera. Merci à tous
Si vous voulez que toute l'édition se fasse dans un UIViewController, vous pouvez utiliser.
[[self view]endEditing:YES];
et si vous voulez cacher le clavier d'un UITextField particulier, utilisez.
1. ajouter un délégué dans votre viewcontroller.h
<UITextFieldDelegate>
-
faire la délégation incapable à votre champ de texte .
self.yourTextField.delegate = self ;
-
ajoutez cette méthode dans votre viewcontroller.
-(BOOL)textFieldShouldEndEditing :(UITextField *)textField{ [textField resignFirstResponder] ; return YES;}
Toute personne à la recherche de Swift 3
1) Assurez-vous que votre Délégué de UITextField est relié à votre ViewController dans le Storyboard
2) Mise en œuvre UITextFieldDelegate dans votre fichier ViewController.Swift (par exemple class ViewController : UIViewController, UITextFieldDelegate { )
3) Utiliser la méthode de délégation ci-dessous
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return false }
Définir par programme le délégué de l'UITextField dans le swift 3
Implémenter UITextFieldDelegate dans votre fichier ViewController.Swift (par exemple, class 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:- handling delegate 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
}
2 votes
[self.view endEditing:YES] ; en touches commence le délégué est la meilleure solution