web-dev-qa-db-fra.com

Le délégué pour UITextField ne fonctionne pas ... Le bouton Retour ne répond pas

Je viens tout juste de commencer avec xcode et objective-c et de faire des applications très basiques, mais le problème avec lequel j'ai des problèmes est très basique. le bouton de retour du clavier ne cache pas le clavier.

J'ai cherché sur Internet la solution et tout ce qu'ils ont dit est de connecter le délégué au propriétaire du fichier et d'ajouter la fonction. Cela devrait fonctionner. Je l'ai fait et rien ne fonctionne.

J'ai un bouton ok et cela fonctionne et cliquer sur n'importe quel espace libre à l'écran fonctionne, juste le bouton de retour ....

J'utilise le simulateur, pas encore sur iphone. (xcode 3.2.5 64 bits avec le simulateur 4.2).

Il s’agit de la ligne de code devant connecter le délégué à chaque textFiled. 1. J'ai déjà essayé de renvoyer YES et NO, cela n'a pas fonctionné. 2. J'ai essayé à la fois un nom d'objet spécifique pour le textField et cette manière générale, n'a pas fonctionné.

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

Dans la: connexion de base du contrôleur de vue -> connexions -> prises, j'ai le: délégué - propriétaire du fichier. et dans le propriétaire du fichier dans le référencement des points de vente, il y a: delegate - Texte de style arrondi .....

EDIT - J'ai oublié de mentionner avant, j'ai vérifié et la méthode n'est pas appelée !!!

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
NSLog(@"Working!!!");
[textField resignFirstResponder];
return YES;

}

que dois-je faire pour y arriver? c'est pourquoi les gens disent de connecter le délégué, mais dans mon cas, il est connecté et ne déclenche pas la fonction ... Je sais que c'est une question idiote, mais pour un nobie comme moi, la solution n'est pas évidente ...

OK, un autre Edit - avec tout mon code: je ne comprends pas ce qu'il faut faire .... C'est: basicViewController.h:

#import <UIKit/UIKit.h>

@interface basicViewController : <#superclass#> <UITextFieldDelegate>

@interface basicViewController : UIViewController <UITextFieldDelegate> {
//every object that we want to interact with (like text field or lable) is call an   outlet!!!!
//here we define the outlets for our program
IBOutlet UITextField *txtName;
IBOutlet UILabel *lblMessage;
 }

//here are the getters and setter for our outlets
@property (nonatomic, retain) IBOutlet UITextField *txtName;
@property (nonatomic, retain) IBOutlet UILabel *lblMessage;

//method decleration for the OK button action
- (IBAction) doSomething;



//method for hiding the keyboard when clicking on empty area in the app
   //we will put an invisible button on all area and clicking on it will make keyboard disapear
   - (IBAction) makeKeyboardGoAway;

   @end

Ceci est basicViewController.m:

 #import "basicViewController.h"

 @implementation basicViewController

 //synthesizeing the objects that we made' this will create the getter and setters automaticly
 @synthesize txtName;
 @synthesize lblMessage;

 - (IBAction) doSomething{
// makeing keyboard disapear when pressing ok button (doing that form the text field)
//when pressing the OK button, the keyboard will disapear and when clicking in the text field it will show again
[txtName resignFirstResponder];



NSString *msg = [[NSString alloc] initWithFormat:@"Hello, %@",txtName.text];

//the objective-c way for setting the test in the text field
[lblMessage setText:msg];   
//the regular object oriented way
//lblMessage.text = msg;
[msg  release];
 }    

 - (IBAction) makeKeyboardGoAway{
[txtName resignFirstResponder];
 } 

 //when clicking the return button in the keybaord
 - (BOOL)textFieldShouldReturn:(UITextField *)textField{
NSLog(@"Working!!!");
[textField resignFirstResponder];
return YES;
 }


 - (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
 }

 - (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
 }


 - (void)dealloc {
     [super dealloc];
 }

 @end

Peut-être que maintenant je suis plus clair, désolé de ne pas l'avoir fait auparavant. Quelqu'un a une idée de ce que je fais mal? ça devrait être assez étroit en avant .....

EDIT - Ajouter une image de tous les éléments, j'espère que cela m'aidera à m'aider :-) alt text

10x beaucoup pour chaque personne qui essaie de l'aider .... j'aime beaucoup ce framework, il est vraiment génial après c ++ et Java, python et bien d'autres ... et je travaille avec un livre, mais c'est pour iOS 3.1, c'est peut-être le problème .....

13
Erez

Tout d'abord, vous devriez vérifier si textFieldShouldReturn: est effectivement appelé en ajoutant une instruction NSLog ou un point d'arrêt au début de la méthode.

Une fois que cela est fait, essayez de déclarer manuellement que votre contrôleur de vue est conforme au protocole <UITextFieldDelegate> dans votre fichier d'interface:

@interface YourClass : ... <UITextFieldDelegate>

Déclarez également une propriété et un point de vente pour votre UITextField, établissez les connexions appropriées dans IB et déclarez manuellement self en tant que délégué UITextField avec:

self.yourUITextFieldObject.delegate = self;

Une fois que cela est fait, voyez si votre méthode ci-dessus est maintenant appelée et assurez-vous de renvoyer OUI.

31
Rog

Il suffit d'écrire une ligne dans le 

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
}

avant le retour OUI; la version finale sera celle indiquée ci-dessous:

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

-(void)textFieldDidEndEditing:(UITextField *)textField{

    NSLog(@"%@",textField.text);
}
6
user1229932

Vous devez affecter le délégué des champs de texte à votre propriétaire de fichier. Les champs de texte envoient le message, mais n’ont pas de délégué pour y répondre.

Utilisez le constructeur d'interface pour le faire. Vous devez implémenter cette méthode ..

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

Comme Rog l'a dit, n'oubliez pas d'enregistrer le champ de texte auprès du délégué, vous pouvez le faire manuellement, mais dans Storyboard, vous pouvez simplement contrôler le glisser de tous vos champs de texte vers le contrôleur de vue et enregistrer le délégué (choisissez délégué). Seuls les champs de texte enregistrés peuvent utiliser toutes ces méthodes.

Donc, cette ligne est importante:

self.yourUITextFieldObject.delegate = self;

Ou encore plus facile ces jours-ci consiste simplement à utiliser le storyboard:

enter image description here

2
Jordy

mettre un journal au 

- (IBAction) makeKeyboardGoAway

une fonction. Je pense que sa cette méthode chaque fois que quelque chose est tapé sur l'écran. Dans ce cas, vous devrez envoyer l'événement tactile au champ de texte. Vous n'êtes pas sûr de savoir comment cela est fait, mais cela devrait suffire. Sinon, supprimez le qui prend soin de cliquer (cliquer) dans la vue et essayez de faire ce que vous faites.

1
Nareshkumar

textfield est dans une sous-vue? dans ce cas, assurez-vous que textfield a pour délégué FileOwner. 

1
doxsi

Le problème est probablement que votre contrôleur de vue réel dans l'application en cours d'exécution n'est pas un "basicViewController" mais un UIViewController qui n'implémente pas le protocole UITextFieldDelegate.

Ce que vous avez fait dans le générateur d'interface en sélectionnant votre classe "basicViewController", car FilesOwner est juste déclarant l'objet FilesOwner dans votre application en cours d'exécution étant de type basicViewController; l'objet réel est pas instancié par cette déclaration et dans votre cas, il ne se trouve pas dans xib/nib. 

Une autre partie de votre code instancie en réalité un objet contrôleur de vue et charge le fichier xib/nib. À cet endroit, je suppose que votre code instancie un UIViewController (généralement avec un code généré automatiquement) et non une instance de votre basicViewController; vous devez simplement changer de classe là-bas. 

De plus, cette erreur se produit souvent lors de l'utilisation d'un UINavigationController ou d'un UITabBarController dans Interface Builder qui est (devrait être) configuré pour instancier et charger d'autres vues personnalisées. Si vous utilisez un tel contrôleur de niveau supérieur, vérifiez qu'il est réellement configuré pour utiliser votre basicViewController, et non UIViewController lors du chargement de votre vue à partir de xib/nib.

Espérons que cela résout le problème!

1
Sascha

Pouvez-vous essayer cela ..

@interface ClassName : SuperClass < UITextFieldDelegate >
0
Bluely

Utilisez comme ça ...

textfield.delegate=self;

et utilisez la UITextFieldDelegate dans la classe .h

0

J'ai eu le même problème. J'ai la classe individuelle MyTextFieldDelegate uniquement pour mon UITextFieldDelegate, qui étend UIViewController et UITextFieldDelegate. J'ai textFieldShouldReturn (...) et quelques autres fonctions dedans. Dans la fonction ViewDidLoad (...) de mon UIViewController actuel (par exemple, MyViewController), j'ai écrit:

let myTextfieldDelegateLowLimit = MyTextFieldDelegate()
textfieldLowLimitTo.delegate = myTextfieldDelegateLowLimit

Et ça n'a pas marché pour moi. Mais lorsque j'ai déclaré myTextfieldDelegateLowLimit globalement, cela a fonctionné.

0
Zhebzhik Babich

Vous pouvez toujours fermer le clavier lorsque vous ne savez même pas dans quelle vue se trouve le champ de texte en utilisant:

Objectif c:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) 
                                           to:nil 
                                         from:nil 
                                     forEvent:nil];

Rapide:

UIApplication.sharedApplication().sendAction("resignFirstResponder", 
                                           to:nil, 
                                         from:nil, 
                                     forEvent:nil)
0
OhadM