Je sais que je dois dire à mon UITextField de démissionner du premier répondant lorsque je souhaite supprimer le clavier, mais je ne sais pas comment savoir quand l'utilisateur a appuyé sur la touche "Terminé" du clavier. Existe-t-il une notification à surveiller?
Je règle le délégué de la UITextField
dans ma classe ViewController
.
Dans cette classe, j'ai implémenté cette méthode comme suit:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}
Si vous connectez l'événement DidEndOnExit du champ de texte à une action (IBAction) dans InterfaceBuilder, le message sera envoyé lorsque l'utilisateur fermera le clavier (avec la clé de retour) et l'expéditeur sera une référence à UITextField qui a déclenché l'événement.
Par exemple:
-(IBAction)userDoneEnteringText:(id)sender
{
UITextField theField = (UITextField*)sender;
// do whatever you want with this text field
}
Ensuite, dans InterfaceBuilder, liez l'événement DidEndOnExit du champ de texte à cette action sur votre contrôleur (ou tout ce que vous utilisez pour lier des événements à partir de l'interface utilisateur). Chaque fois que l'utilisateur entre du texte et rejette le champ de texte, le contrôleur reçoit ce message.
Vous pouvez également créer une méthode dans votre contrôleur
-(IBAction)editingEnded:(id)sender{
[sender resignFirstResponder];
}
puis dans l'inspecteur de connexion dans IB connectez l'événement "Did End on Exit" à l'événement.
kubi, merci. Votre code a fonctionné. Juste pour être explicite (pour les débutants comme) comme vous dites que vous devez définir le UITextField
de delegate
pour être égal au ViewController dans lequel réside le champ de texte. Vous pouvez le faire où bon vous semble. J'ai choisi la méthode viewDidLoad
.
- (void)viewDidLoad
{
// sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
daTextField.delegate = self;
}
Voici une astuce pour obtenir un comportement de renvoi du clavier automatique sans code du tout. Dans le nib, éditez l'objet proxy Premier répondant dans l'inspecteur d'identité, en ajoutant une nouvelle action de premier répondant. appelons cela dummy:
. À présent, raccordez l'événement Did End on Exit du champ de texte à l'action dummy:
de l'objet proxy First Responder. C'est ça! Etant donné que l'événement Did End on Exit du champ de texte a maintenant une paire action-cible, le champ de texte ferme automatiquement son clavier lorsque l'utilisateur appuie sur Retour; et comme il n'y a pas de pénalité pour ne pas trouver de gestionnaire pour un message envoyé par la chaîne de répondeurs, l'application ne plante pas, même s'il n'y a pas d'implémentation de dummy:
nulle part.
Il suffit d'ajouter
[textField endEditing:YES];
où vous voulez désactiver le clavier et afficher la vue du sélecteur.
Dans Swift, vous pouvez écrire une action IBAction dans le contrôleur et attribuer à l'événement terminé à la sortie du champ de texte cette action.
@IBAction func returnPressed(sender: UITextField) {
self.view.endEditing(true)
}
Vous pouvez aussi utiliser
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.yourTextField resignFirstResponder];
}
Meilleur si vous avez plusieurs Uitextfields:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
Voici ce que je devais faire pour que cela fonctionne, et je pense que cela est nécessaire pour toute personne disposant d'un pavé numérique pour clavier (ou de tout autre sans bouton de fin):
J'ai créé une fonction appelée
-(IBAction)backgroundIsTapped:(id)sender
Cela a également été défini dans le fichier .h.
Après cela, je me suis connecté au bit de toucher du ViewController dans Interface Builder.
Dans la fonction "l'arrière-plan est exploité", j'ai mis ceci:
[answerField resignFirstResponder];
N'oubliez pas de remplacer 'answerField' par le nom du UITextField dont vous souhaitez supprimer le clavier (assurez-vous bien 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!
Vous remarquerez que la méthode "textFieldShouldReturn" fournit l'objet de champ de texte qui a appuyé sur la touche DONE. Si vous définissez le TAG, vous pouvez activer ce champ de texte. Ou vous pouvez suivre et comparer le pointeur de l'objet avec une valeur de membre stockée par son créateur.
Mon approche est la suivante pour une étude personnelle:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
bool fDidResign = [textField resignFirstResponder];
NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");
return fDidResign;
}
En attendant, je mets le test de "validation" qui nie la démission suit. Ce n'est qu'à titre d'illustration, donc si l'utilisateur tape NO! dans le domaine, il ne sera pas rejeté. Le comportement était tel que je voulais, mais la séquence de sortie n'était pas celle que je pensais.
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
if( [[textField text] isEqualToString:@"NO!"] ) {
NSLog(@"%@", textField.text);
return NO;
} else {
return YES;
}
}
Voici ma sortie NSLog pour ce refus suivi de l'acceptation. Vous remarquerez que je retourne le résultat de la démission, mais je m'attendais à ce qu'il me retourne FAUX pour que je fasse rapport à l'appelant?! Autre que cela, il a le comportement nécessaire.
13.313 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:] 13.320 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldEndEditing:] 13.327 StudyKbd [109: 207]! 13.333 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:]: a abandonné le clavier 59.891 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:] 59.897 StudyKbd [109: 207]. : 207] - [StudyKbdViewController textFieldShouldEndEditing:] 59.917 StudyKbd [109: 207] - [StudyKbdViewController doneEditText]: NON 59.928 StudyKbd [109: 207] - [StudyKbdViewController text: Champ: recherche] clavier
Swift 4.2
et ça fonctionnera à 100%
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.textField.delegate = self
}
// hide key board when the user touches outside keyboard
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
// user presses return key
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
si vous voulez toute l'édition d'un UIViewController, vous pouvez l'utiliser.
[[self view]endEditing:YES];
et si vous voulez ignorer un cache de clavier UITextField particulier, utilisez-le.
1.ajoutez un délégué dans votre viewcontroller.h
<UITextFieldDelegate>
rendre la délégation impossible à votre champ de texte.
self.yourTextField.delegate = self;
ajoutez cette méthode à votre contrôleur de vue.
- (BOOL) textFieldShouldEndEditing: (UITextField *) textField {[textField resignFirstResponder]; retourner OUI;}
Définissez par programme le délégué de UITextField dans Swift 3
Implémentez UITextFieldDelegate dans votre fichier ViewController.Swift (par exemple, la classe 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: - traitement du délégué 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
}
Voici une manière assez propre de terminer l’édition avec la touche Retour ou un contact en arrière-plan.
Dans le générateur Interface, intégrez vos champs dans une vue de la classe UIFormView.
Qu'est-ce que cette classe:
Voici le code:
Interface
#import <UIKit/UIKit.h>
@interface UIFormView : UIView<UITextFieldDelegate>
-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;
@end
Mise en oeuvre
#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 méthode textFieldValueIsValid:
, vous pouvez éviter la fin de l'édition si la valeur n'est pas correcte pour le champ donné.
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ésigner un délégué différent dans un domaine particulier, mais pourquoi pas…
Il existe de nombreuses façons d’améliorer cette classe d’affichage sous forme de formulaire: attacher un délégué, faire une mise en page, gérer lorsque les claviers recouvrent un champ (à l’aide du cadre currentEditingTextField), démarrer automatiquement l’édition du champ suivant, ...
Personnellement, je le garde dans mon framework, et toujours en sous-classe pour ajouter des fonctionnalités, il est assez souvent utile "tel quel".
J'espère que ça va aider. Salut à tous
//====================================================
// textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField {
[textField resignFirstResponder];
if(textField.returnKeyType != UIReturnKeyDone){
[[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
}
return YES;
}
essaye ça
- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
if ([text isEqualToString:@"\n"]) {
[textView resignFirstResponder];
return NO;
}
return YES;
}
Voici comment je rejette le clavier dans Swift 4.2 et cela fonctionne pour moi:
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action:
#selector(dismissKeyboard))
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
numberField.resignFirstResponder()
}
Quiconque cherche Swift
1) Assurez-vous que votre délégué de UITextField est connecté à votre ViewController dans le scénarimage
2) Implémentez ITextFieldDelegate dans votre fichier ViewController.Swift (par exemple, la classe ViewController: UIViewController, UITextFieldDelegate {)
3) Utilisez la méthode de délégué ci-dessous
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return false }
Si vous avez créé la vue à l'aide d'Interface Builder, utilisez ce qui suit Créez simplement une méthode,
-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}
Cliquez simplement avec le bouton droit de la souris sur le champ de texte dans la vue et définissez l’événement sur Did End on Exit, puis connectez-le à la méthode "Clé de rejet".
Le meilleur guide pour les débutants est "Développement Head Head iPhone et iPad, 2e édition"
Créez une fonction hidekeyboard et associez-la au champ de texte du fichier .xib, puis sélectionnez DidEndOnExit.
-(IBAction)Hidekeyboard
{
textfield_name.resignFirstResponder;
}